Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Windows中使用FFmpeg对H.264视频进行编码_C++_Windows_Ffmpeg_H.264_Libavcodec - Fatal编程技术网

C++ 在Windows中使用FFmpeg对H.264视频进行编码

C++ 在Windows中使用FFmpeg对H.264视频进行编码,c++,windows,ffmpeg,h.264,libavcodec,C++,Windows,Ffmpeg,H.264,Libavcodec,我正在尝试使用FFmpeg(AV\u CODEC\u ID\u H264)对H.264视频进行编码,但无法正确初始化编解码器。使用其他编解码器(如AV\u codec\u ID\u MPEG1VIDEO)时完全没有问题 avcodec_register_all(); auto codec = avcodec_find_encoder(AV_CODEC_ID_H264); if (!codec) { return false; } auto codec_context = avcodec_al

我正在尝试使用FFmpeg(
AV\u CODEC\u ID\u H264
)对H.264视频进行编码,但无法正确初始化编解码器。使用其他编解码器(如
AV\u codec\u ID\u MPEG1VIDEO
)时完全没有问题

avcodec_register_all();

auto codec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!codec) { return false; }

auto codec_context = avcodec_alloc_context3(codec);
if (!codec_context) { return false; }

codec_context->codec_id = codec->id;
codec_context->codec_type = AVMEDIA_TYPE_VIDEO;

codec_context->width = w; // w = 1280 on tests
codec_context->height = h; // h = 1024 on tests
codec_context->bit_rate = w * h * 4;

codec_context->time_base = { 1, fps }; // fps = 50 on tests
codec_context->framerate = { fps, 1 };

codec_context->gop_size = 10;

codec_context->pix_fmt = AV_PIX_FMT_YUV420P;

if (codec->id == AV_CODEC_ID_H264) {
    av_opt_set(codec_context->priv_data, "preset", "veryfast", 0);
}

if (avcodec_open2(codec_context, codec, nullptr) < 0) { return false; } // < Fails here
avcodec\u register\u all();
自动编解码器=avcodec\U find\U编码器(AV\U编解码器\U ID\U H264);
如果(!codec){返回false;}
自动编解码器\u上下文=avcodec\u alloc\u上下文3(编解码器);
如果(!codec_context){return false;}
编解码器上下文->编解码器id=编解码器->id;
codec\u context->codec\u type=AVMEDIA\u type\u VIDEO;
编解码器\u上下文->宽度=w;//测试时w=1280
编解码器上下文->高度=h;//测试时h=1024
编解码器上下文->比特率=w*h*4;
codec_context->time_base={1,fps};//测试时fps=50
编解码器上下文->帧率={fps,1};
codec_context->gop_size=10;
codec_context->pix_fmt=AV_pix_fmt_YUV420P;
if(编解码器->id==AV\u编解码器\u id_uH264){
av_opt_set(编解码器上下文->私有数据,“预设”,“veryfast”,0);
}
如果(avcodec_open2(codec_context,codec,nullptr)<0){return false;}/<在此失败
我收到的第一条错误消息是:

[h264_amf@08e75900]DLL amfrt32.DLL无法打开

据我所知,这个DLL属于Advanced Media Framework,一个从AMD硬件访问硬件加速的SDK。我没有AMD卡,所以我的电脑中没有安装这样的驱动程序或SDK。无论如何,我下载了SDK并将驱动程序的DLL复制到我的二进制文件目录。已删除丢失的DLL错误,但正如预期的那样,模块未正确初始化:

[h264_amf@0375b600]CreateComponent(AMFVideoEncoderVCE_AVC)失败,错误为13

问题:我是否缺少任何东西(参数、依赖项)?有没有办法禁用AMF加速功能或将其标记为可选/自动检测/其他功能?

PS:我希望在一个非常异构的客户端中运行编码可执行文件,假设Windows 10和其他几乎没有什么,所以我不能将其标记为强制的特定于供应商的加速

PS:我正在使用Windows 32位的预编译的FFmpeg 4.2.1 LGPL版本。我的代码正在使用Visual Studio 2017进行编译


如果问题出在预编译版本中,我很乐意重新构建它。如果是,在构建x264或ffmpeg时应该使用哪些配置参数?

软件x264编码器使用libx264,它是GPL,因此不包括在LGPL ffmpeg中build@AlanBirtles哦谢谢,是的,我已经用GPL构建进行了测试,它加载正确。谢谢你提供的信息。请随意添加它作为接受它的答案。如果您有关于商业选项(包括许可fr H.264)的信息,我也将不胜感激。再次感谢。
libopenh264
提供了基于LGPL的编码器。如果您分发GPLed ffmpeg构建/库,请允许请求您正在链接的应用程序的源代码。软件x264编码器使用的libx264是GPL,因此不包括在LGPL ffmpeg中build@AlanBirtles哦谢谢,是的,我已经用GPL构建进行了测试,它加载正确。谢谢你提供的信息。请随意添加它作为接受它的答案。如果您有关于商业选项(包括许可fr H.264)的信息,我也将不胜感激。再次感谢。
libopenh264
提供了基于LGPL的编码器。如果您分发GPLed ffmpeg构建/库,请允许请求您正在链接的应用程序的源代码。