FFMPEG编译后的异常-gcc编译异常
以下是avio_reading.c,该样例是ffmpeg官方样例
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
#include <libavutil/file.h>
struct buffer_data {
uint8_t *ptr;
size_t size; ///< size left in the buffer
};
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
{
struct buffer_data *bd = (struct buffer_data *)opaque;
buf_size = FFMIN(buf_size, bd->size);
printf("ptr:%p size:%zu\n", bd->ptr, bd->size);
/* copy internal buffer data to buf */
memcpy(buf, bd->ptr, buf_size);
bd->ptr += buf_size;
bd->size -= buf_size;
return buf_size;
}
int main(int argc, char *argv[])
{
AVFormatContext *fmt_ctx = NULL;
AVIOContext *avio_ctx = NULL;
uint8_t *buffer = NULL, *avio_ctx_buffer = NULL;
size_t buffer_size, avio_ctx_buffer_size = 4096;
char *input_filename = NULL;
int ret = 0;
struct buffer_data bd = { 0 };
if (argc != 2) {
fprintf(stderr, "usage: %s input_file\n"
"API example program to show how to read from a custom buffer "
"accessed through AVIOContext.\n", argv[0]);
return 1;
}
input_filename = argv[1];
/* register codecs and formats and other lavf/lavc components*/
av_register_all();
/* slurp file content into buffer */
ret = av_file_map(input_filename, &buffer, &buffer_size, 0, NULL);
if (ret < 0)
goto end;
/* fill opaque structure used by the AVIOContext read callback */
bd.ptr = buffer;
bd.size = buffer_size;
if (!(fmt_ctx = avformat_alloc_context())) {
ret = AVERROR(ENOMEM);
goto end;
}
avio_ctx_buffer = av_malloc(avio_ctx_buffer_size);
if (!avio_ctx_buffer) {
ret = AVERROR(ENOMEM);
goto end;
}
avio_ctx = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size,
0, &bd, &read_packet, NULL, NULL);
if (!avio_ctx) {
ret = AVERROR(ENOMEM);
goto end;
}
fmt_ctx->pb = avio_ctx;
ret = avformat_open_input(&fmt_ctx, NULL, NULL, NULL);
if (ret < 0) {
fprintf(stderr, "Could not open input\n");
goto end;
}
ret = avformat_find_stream_info(fmt_ctx, NULL);
if (ret < 0) {
fprintf(stderr, "Could not find stream information\n");
goto end;
}
av_dump_format(fmt_ctx, 0, input_filename, 0);
end:
avformat_close_input(&fmt_ctx);
/* note: the internal buffer could have changed, and be != avio_ctx_buffer */
if (avio_ctx) {
av_freep(&avio_ctx->buffer);
av_freep(&avio_ctx);
}
av_file_unmap(buffer, buffer_size);
if (ret < 0) {
fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
return 1;
}
return 0;
}
三个动态链接在 /usr/lib
libavcodec.so
libavformat.so
libavutil.so
另外安装的FFMPEG如下:
root@cruse-G41MT-D3:~# ls /usr/local/ffmpeg/lib/
libavcodec.a libavfilter.so.5 libswresample.a
libavcodec.so libavfilter.so.5.1.103 libswresample.so
libavcodec.so.56 libavformat.a libswresample.so.1
libavcodec.so.56.4.101 libavformat.so libswresample.so.1.1.100
libavdevice.a libavformat.so.56 libswscale.a
libavdevice.so libavformat.so.56.9.100 libswscale.so
libavdevice.so.56 libavutil.a libswscale.so.3
libavdevice.so.56.1.100 libavutil.so libswscale.so.3.1.100
libavfilter.a libavutil.so.54 pkgconfig
libavfilter.so libavutil.so.54.10.100
root@cruse-G41MT-D3:~# ls /usr/local/ffmpeg/lib/
libavcodec.a libavfilter.so.5 libswresample.a
libavcodec.so libavfilter.so.5.1.103 libswresample.so
libavcodec.so.56 libavformat.a libswresample.so.1
libavcodec.so.56.4.101 libavformat.so libswresample.so.1.1.100
libavdevice.a libavformat.so.56 libswscale.a
libavdevice.so libavformat.so.56.9.100 libswscale.so
libavdevice.so.56 libavutil.a libswscale.so.3
ubuntu 13.10编译后的异常如下
root@cruse-G41MT-D3:~/mpeg_project# gcc -o avio_reading avio_reading.c -lavformat -lavcodec -lavutil
/usr/bin/ld: warning: libswresample.so.1, needed by /usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib/libavcodec.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib/libavcodec.so:对‘swr_close@LIBSWRESAMPLE_1’未定义的引用
/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib/libavcodec.so:对‘swr_convert@LIBSWRESAMPLE_1’未定义的引用
/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib/libavcodec.so:对‘swr_is_initialized@LIBSWRESAMPLE_1’未定义的引用
/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib/libavcodec.so:对‘swr_alloc@LIBSWRESAMPLE_1’未定义的引用
/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib/libavcodec.so:对‘swr_free@LIBSWRESAMPLE_1’未定义的引用
/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib/libavcodec.so:对‘swr_init@LIBSWRESAMPLE_1’未定义的引用
collect2: error: ld returned 1 exit status
我想可能是编译是路径问题,但是一直没有解决。
请各位帮忙提供编译的意见和建议,谢谢!