解读ffmpeg例程decoding_encoding.c

1.
static int chack_sample_fmt(AVCodec *codec, enum AVSampleFormat sample_fmt)
检查所给的实例格式是否是ffmpeg编码器所认识的格式
static int select_sample_rate(AVCodec * codec)
选择最佳的取样频率
static int select_channel_layout(AVCodec* codec)
为高速通道选择布局
---------------------------------------------------------------------------
2.音频编码:
static void audio_encode_example(const char *filename)
---------------------------------------------------------------------------
3.音频解码
static void audio_decode_example(const char* outfilename, const char *filename)
---------------------------------------------------------------------------
4.视频编码
static void video_encode_example(const char *filename, int codec_id)
a.AVCodec *codec;
codec = avcodec_find_encoder(codec_id);
根据codec_id获取特定的编码器,avcodec_find_encoder返回的值传入codec中,
codec获取编码器的信息和参数。
b.AVCodecContext *c = NULL;
c = avcodec_alloc_context3(codec);
获取编码器参数
c->bitrate 修改编码器的比特率
c->width 设置编码器宽度
c->height 设置编码器高度
c-time_base (AVRational){1,25} 设置帧率为25/1=25 frames/s
c-gop_size 每隔多少帧插关键帧
c-max_b_frames 设置B帧的帧数
c-pix_fmt 设置颜色空间的格式
c.av_opt_set(c-priv_data, "preset", "slow", 0);
d.avcodec_open2(c, codec, NULL);
打开/创建编码器
e.frame = avcodec_alloc_frame();
为编码帧开辟存储空间
设置帧的一些参数
frame->format = c->pix_fmt;
frame->width = c->width;
frame-height = c->height;
f.ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height, c->pix_fmt, 32);
为编码后的帧开辟空间
g.ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
编码器对帧进行编码
h.avcodec_close(c); //关闭编码器
av_free(c);
av_freep(&frame->data[0]);
av_codec_free_frame(&frame);
---------------------------------------------------------------------------
5.视频解码器
a.static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize, char *filename)
把解码后的数据帧存储为.pgm格式的图片
b.static int decode_write_frame(const char*outfilename, AVCodecContext *avctx, AVFrame *frame, int *frame_count, AVPacket *pkt, int last)
avcodec_decode_video2(avctx, frame, &got_frame, pkt);
解码一帧

c.static void video_decode_example(const char *outfilename, const char* filename)

-------------------------->未完待续<------------------------------------

<think>好的,我现在需要帮用户解决编译时出现的undefined reference错误。首先,用户提供的错误信息显示在链接阶段,多个函数如av_strerror、av_log_set_level等未找到引用。这些函数都属于FFmpeg库,所以问题可能出在链接器没有正确链接FFmpeg的库文件。 首先,我得确认这些函数属于FFmpeg的哪个库。比如,av_strerror和av_log_set_level可能在libavutil里,而av_seek_frame可能在libavformat。用户的项目在链接时可能没有包含这些库。因此,用户需要在编译命令中添加-lavutil、-lavformat等选项。 接下来,用户使用的是CMake,所以需要检查CMakeLists.txt文件是否正确包含了FFmpeg的库和头文件。可能需要使用find_package来查找FFmpeg组件,或者手动指定库的路径和名称。如果find_package找不到,可能需要设置FFmpeg_DIR或者确保FFmpeg正确安装。 另外,用户链接的是CXX可执行文件,但主项目是C对象,可能需要检查是否在CMake中正确指定了C和C++的链接顺序,以及是否所有必要的库都被包含。还有,FFmpeg库之间的依赖关系需要按正确的顺序排列,比如libavcodec依赖于libavutil,所以在链接时libavcodec应该放在前面。 可能的解决方案包括:在CMakeLists.txt中添加target_link_libraries,包含avcodec、avformat、avutil、swscale等库。同时,确保系统已经安装了FFmpeg的开发包,比如在Ubuntu上是libavcodec-dev等。如果用户手动编译了FFmpeg,可能需要指定库的路径,如使用link_directories。 最后,建议用户检查FFmpeg的安装情况,确认头文件和库文件的位置是否正确,以及在CMake中是否正确配置了这些路径。如果问题依旧,可能需要详细查看CMake的输出,确认链接命令是否包含了所有必要的库。</think>这个编译错误是由于项目链接时缺少FFmpeg相关库导致的未定义引用问题。以下是详细分析和解决方案: **错误原因分析:** 1. 错误信息显示如$undefined\ reference\ to\ `av\_strerror'$等符号未定义 2. 这些符号都属于FFmpeg库的函数,说明项目未正确链接FFmpeg相关库 3. 涉及的主要FFmpeg组件包括: - $libavutil$(提供av_strerror等基础函数) - $libavformat$(提供av_seek_frame等媒体格式处理函数) - $libavcodec$(编解码相关函数) **解决方案步骤:** 1. **安装FFmpeg开发库** ```bash # Ubuntu/Debian sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev # Fedora sudo dnf install ffmpeg-devel ``` 2. **修改CMakeLists.txt** ```cmake # 在项目配置部分添加 find_package(PkgConfig REQUIRED) pkg_check_modules(FFMPEG REQUIRED libavcodec libavformat libavutil libswscale) # 在可执行文件配置部分添加链接 target_link_libraries(main PRIVATE ${FFMPEG_LIBRARIES} # 其他已有库... ) # 添加包含目录 target_include_directories(main PRIVATE ${FFMPEG_INCLUDE_DIRS} ) ``` 3. **验证FFmpeg安装路径** ```bash # 确认库文件存在 ls /usr/lib/x86_64-linux-gnu/libavcodec.so ls /usr/lib/x86_64-linux-gnu/libavformat.so ``` 4. **完整编译命令示例** ```bash gcc -o main main.c mouse_cursor_icon.c \ -I/usr/include/x86_64-linux-gnu \ -lavcodec -lavformat -lavutil -lswscale \ `pkg-config --libs --cflags lvgl` ``` **补充说明:** 1. 如果使用静态链接,需要确认已编译静态库文件(.a)的存在路径 2. 不同Linux发行版可能需要调整包管理器安装命令 3. 建议保持FFmpeg库版本一致性(推荐4.x以上版本) 4. 对于交叉编译环境,需要配置正确的FFmpeg工具链路径 **验证方法:** ```bash # 查看链接后的可执行文件是否包含FFmpeg符号 ldd ./main | grep avcodec nm ./main | grep av_strerror ``` 按照上述步骤操作后,应该可以解决FFmpeg相关符号未定义的链接错误。如果问题仍然存在,请检查FFmpeg库版本是否与项目要求的版本匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值