FFmpeg问题梳理
目录
- FFmpeg问题梳理
-
- 1.“main函数冲突”
- 2.av_register_all();已经被否决
- 3.codec已经被否决
- 4.执行程序“初始化以后应用程序无法正常启动0xc00007b”
- 5.avcodec_decode_video2已否决
- 6.未知错误,检查以下文件可获得相关详细信息
- 7.avformat_open_input()== -2
- 8.avpicture_get_size 无法解析的外部符号
- 9. avpicture_fill 无法解析的外部符号
- 10.错误 MSB3073命令“setlocal
- 11.错误 LNK2019 无法解析的外部符号 av_free_packet
- 12.添加日志
- 13.异常处理
1.“main函数冲突”
在做渲染的过程中,会用到#include "SDL2/SDL.h"
这里你的main函数会和SDL包中的冲突,导致无法找到程序的入口。
解决方法:
添加:#define SDL_MAIN_HANDLED
在程序最上端
2.av_register_all();已经被否决
最新版直接删除
就可以
旧:
//版本问题,现在已经被替换成为:
//avdevice_register_all();//功能是初始化
3.codec已经被否决
编码和封装的代码融合在一块耦合性较大,codecpar替代codec
替代方法:
for (i = 0; i < pFormatC->nb_streams; i++)//遍历视频流
//原if (pFormatC->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
if (pFormatC->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
videoindex = i;
break;
}
//原pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
pCodec = avcodec_find_decoder(pFormatC->streams[videoindex]->codecpar->codec_id);
4.执行程序“初始化以后应用程序无法正常启动0xc00007b”
网上参考过很多解决方法,如:
方法1
- 点击“开始”->在搜索栏内输入“cmd”,右键点击cmd.exe,选择以管理员身份运行,跳出提示框时选择继续。
- 键入sfc /scannow ,然后按 Enter。系统开始扫描
我不是这个问题
方法2
我这次的原因是dll版本不兼容,通俗来说就是有个别dll的版本不符合要求,要做到就是找到合适的dll包,全部替换掉现有的。
全部拷贝过去就可以了,然后成功解决。
5.avcodec_decode_video2已否决
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);
上面这句是以前的函数接口,现在已经替换为:
ret = avcodec_send_packet(pCodecCtx, packet);
got_picture = avcodec_receive_frame(pCodecCtx, pFrame);
6.未知错误,检查以下文件可获得相关详细信息
打开路径:
文件描述:
后来发现跟这俩没啥关系,直接用VS安装包修复
就行。
应该是有个进程有问题,关掉进程或者重启电脑也可以。
7.avformat_open_input()== -2
int res = avformat_open_input(&pFormatC, str, nullptr, nullptr);
通过测试发现res的值一直是-2,文件路径也没有问题。
问题出在FFmpeg很多库都是C语义库,因此不能直接传C++字符串进来,修改如下:
int res = avformat_open_input(&pFormatC, str.c_str(), nullptr, nullptr);
8.avpicture_get_size 无法解析的外部符号
旧版本接口:
avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height)
新版本改为:
av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1)
参数分别对应像素格式、图像宽、图像高。最后多了一个参数,是为了设定内存对齐的对齐数,也就是按多大的字节进行内存对齐。比如设置为1,表示按1字节对齐,那么得到的结果就是与实际的内存大小一样。再比如设置为4,表示按4字节对齐。也就是内存的起始地址必须是4的整倍数。
9. avpicture_fill 无法解析的外部符号
旧版本接口:
((AVPicture*)pictureYUV, buffer_YUV, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
新版本改为:
av_image_fill_arrays(pictureYUV->data, pictureYUV->linesize, buffer_YUV, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1);
10.错误 MSB3073命令“setlocal
这个问题很少见,在网上搜了很多也没见到。
情况1:
经过自己分析测试,找到了问题应该是在Cmake构建项目的时候,生成的部分文件,每次修改文件就会出现这个错误,如:
开始构建的时候,我命名规范有问题,就想修改一下,修改文件名后报错:
解决方法
:
先在外面修改好文件名,再通过Cmake去构建项目,然后就成功了。
情况2:
打开任务管理器,详细信息,找到你正在编译的exe,结束任务即可。
原因是出自程序没有正常关闭。
11.错误 LNK2019 无法解析的外部符号 av_free_packet
用av_packet_unref()
替换
12.添加日志
av_log(NULL, AV_LOG_FATAL, "SDL_CreateMutex():%s\n", SDL_GetError());
13.异常处理
这个问题头疼了很多天,仔细分析堆溢出一定是:
- 释放内存的问题
- 申请内存的问题
后面发现是申请队列大小的时候,考虑的不够全面: