首页| 论坛| 消息

标题:qt+ffmpeg开发经验技巧
作者:liudianwu
日期:2024-03-20 14:20
内容:

1. ffmpeg的库有链接顺序要求,如果不按照顺序来,也许在windows上没有问题,但是到了unix系统很可能有问题,报错提示云里雾里的找不到原因。顺序参照ffmpeg自带示例中的编译链接顺序即可。正确顺序是 LIBS += -L/ -lavformat -lavfilter -lavcodec -lswresample -lswscale -lavutil -lavdevice 。不是所有的库都是必须的,比如avdevice库,如果代码中没用上也没引用,可以不需要。
2. ffmpeg解码中,av_find_best_stream第五个参数传入AVCodec的话,就直接获取到了值,而不用avcodec_find_decoder来处理。
3. ffmpeg在解码的时候,avcodec_alloc_context3的参数AVCodec不是必须的,如果这里是NULL,则下面avcodec_open2的时候就必须传入。编码的时候在avcodec_alloc_context3的时候必须传入,否则下面打开失败。
4. 解码阶段,每次av_read_frame后,使用完对应的packet数据,必须调用av_packet_unref,否则内存泄漏。编码阶段,每次av_write_frame后,里面会自动调用av_packet_unref。
5. avpacket表示压缩的视音频数据(解码前和编码后),avframe表示未压缩的视音频数据(解码后和编码前),视音频文件以及传输都是使用压缩的数据,收到数据解码后才是未压缩的数据,才能直接绘制和播放。
6. 解码对应av_read_frame/avcodec_send_packet/avcodec_receive_frame,编码对应avcodec_send_frame/avcodec_receive_packet/av_write_frame。可以看到命名非常规整,编码刚好和解码顺序相反。
7. avcodec_send_packet和avcodec_receive_frame并不是一一对应的调用关系,而是一个avcodec_send_packet的调用,可能会对应多个avcodec_receive_frame函数的调用。因为解码器内部是有缓存和参考帧的,并不是每送进去一个数据包就能解码出一帧数据,可能出现送进去几个数据包,但是暂时没有数据帧解码输出的情况,也可能会出现某个时间点送进去一个数据包,然后会输出多个数据帧的情况。但是实际使用过程中你会发现你遇到过的99.9%的视音频文件或者流都是一对一关系,一个avcodec_send_packet就对应一次avcodec_receive_frame。
8. 在ffmpeg函数接口中,有不少带数字结尾的函数,比如avcodec_alloc_context3、avcodec_decode_video2、avcodec_decode_audio4,这种一般就是不断迭代的结果。比如早期版本很可能有个函数avcodec_alloc_context,但是后面又新增了更完善的函数,又希望用户能够快速找到该函数,所以直接后面加个数字用以区分。这基本上都是程序员的惯例 ..

回复 发表
主题 版块