FFmpeg问题梳理

FFmpeg问题梳理

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

  1. 点击“开始”->在搜索栏内输入“cmd”,右键点击cmd.exe,选择以管理员身份运行,跳出提示框时选择继续。
  2. 键入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.异常处理

在这里插入图片描述
在这里插入图片描述
这个问题头疼了很多天,仔细分析堆溢出一定是:

  1. 释放内存的问题
  2. 申请内存的问题
    后面发现是申请队列大小的时候,考虑的不够全面:

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kris_paul/article/details/126402470