ffmpeg libx264 AVCodecContext 设置

     2023-03-13     256

关键词:

【中文标题】ffmpeg libx264 AVCodecContext 设置【英文标题】:ffmpeg libx264 AVCodecContext settings 【发布时间】:2012-02-28 16:32:49 【问题描述】:

我正在使用最近的 Windows(2011 年 1 月)ffmpeg 版本并尝试在 H264 中录制视频。使用以下设置可以在 MPEG4 中正常录制:

c->codec_id = CODEC_ID_MPEG4;
c->codec_type = AVMEDIA_TYPE_VIDEO;
c->width = VIDEO_WIDTH;
c->height = VIDEO_HEIGHT;
c->bit_rate = c->width * c->height * 4;
c->time_base.den = FRAME_RATE;
c->time_base.num = 1;
c->gop_size = 12;
c->pix_fmt = PIX_FMT_YUV420P;

只需将 CODEC Id 更改为 H264 就会导致 avcodec_open() 失败 (-1)。我找到了可能的设置列表How to encode h.264 with libavcodec/x264?。我已经尝试了这些,没有设置 pix_fmt,avcodec_open() 仍然失败,但如果我另外设置 c->pix_fmt = PIX_FMT_YUV420P;然后我得到一个除以零的异常。

然后我在这里看到一些帖子说我不应该设置任何内容(除了 code_id、codec_type、width、height 以及可能的 bit_rate 和 pix_fmt),因为库现在自己选择了最佳设置。我尝试了各种组合,仍然 avcode_open() 失败。

有人对当前的操作或某些设置有什么建议吗?

谢谢。

这是一组 H264 设置,它们给出了我描述的问题:

static AVStream* AddVideoStream(AVFormatContext *pOutputFmtCtx, 
int frameWidth, int frameHeight, int fps)

AVCodecContext* ctx;
AVStream* stream;

stream = av_new_stream(pOutputFmtCtx, 0);
if (!stream) 

    return NULL;


ctx = stream->codec;

ctx->codec_id = pOutputFmtCtx->oformat->video_codec; //CODEC_ID_H264
ctx->codec_type = AVMEDIA_TYPE_VIDEO;
ctx->width = frameWidth;             //704
ctx->height = frameHeight;           //576
ctx->bit_rate = frameWidth * frameHeight * 4;

ctx->coder_type = 1;  // coder = 1
ctx->flags|=CODEC_FLAG_LOOP_FILTER;   // flags=+loop
ctx->me_cmp|= 1;  // cmp=+chroma, where CHROMA = 1
ctx->partitions|=X264_PART_I8X8+X264_PART_I4X4+X264_PART_P8X8+X264_PART_B8X8; // partitions=+parti8x8+parti4x4+partp8x8+partb8x8
ctx->me_method=ME_HEX;    // me_method=hex
ctx->me_subpel_quality = 7;   // subq=7
ctx->me_range = 16;   // me_range=16
ctx->gop_size = 250;  // g=250
ctx->keyint_min = 25; // keyint_min=25
ctx->scenechange_threshold = 40;  // sc_threshold=40
ctx->i_quant_factor = 0.71; // i_qfactor=0.71
ctx->b_frame_strategy = 1;  // b_strategy=1
ctx->qcompress = 0.6; // qcomp=0.6
ctx->qmin = 10;   // qmin=10
ctx->qmax = 51;   // qmax=51
ctx->max_qdiff = 4;   // qdiff=4
ctx->max_b_frames = 3;    // bf=3
ctx->refs = 3;    // refs=3
ctx->directpred = 1;  // directpred=1
ctx->trellis = 1; // trellis=1
       ctx->flags2|=CODEC_FLAG2_BPYRAMID+CODEC_FLAG2_MIXED_REFS+CODEC_FLAG2_WPRED+CODEC_FLAG2_8X8DCT+CODEC_FLAG2_FASTPSKIP;  // flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip
ctx->weighted_p_pred = 2; // wpredp=2
// libx264-main.ffpreset preset
ctx->flags2|=CODEC_FLAG2_8X8DCT;
ctx->flags2^=CODEC_FLAG2_8X8DCT;    // flags2=-dct8x8

// if set this get divide by 0 error on avcodec_open()
// if don't set it get -1 error on avcodec_open()
//ctx->pix_fmt = PIX_FMT_YUV420P; 

return stream;

【问题讨论】:

您确定 h.264 编解码器包含在 ffmpeg 构建中吗? 我正在使用ffmpeg.zeranoe.com/builds 构建。他们说它是用 --enable-libx264 构建的。 请发布您的CODEC_ID_H264代码 将 avcodeccontext avrational 设置为正确的值。 我有完全相同的问题: - 从ffmpeg.zeranoe.com/builds 下载的源代码 - avcodec_open() 为 CODEC_ID_H264 返回 -1 - avcodec_open() 非常适用于 CODEC_ID_MPEG2VIDEO - ffmpeg.zeranoe.com/builds 表明库是用 --enable-libx264 构建的 那么,你找到解决方案了吗? 【参考方案1】:

根据我的经验,在初始化编解码器时,您应该尽可能少地给 FFMPEG 提供信息。这可能看起来违反直觉,但这意味着 FFMPEG 将使用它的默认设置,这比您自己的猜测更有可能起作用。看看我会在下面包括什么:

AVStream *stream;
m_video_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
stream = avformat_new_stream(_outputCodec, m_video_codec);
ctx = stream->codec;
ctx->codec_id = m_fmt->video_codec;
ctx->bit_rate = m_AVIMOV_BPS;           //Bits Per Second 
ctx->width    = m_AVIMOV_WIDTH;         //Note Resolution must be a multiple of 2!!
ctx->height   = m_AVIMOV_HEIGHT;        //Note Resolution must be a multiple of 2!!
ctx->time_base.den = m_AVIMOV_FPS;      //Frames per second
ctx->time_base.num = 1;
ctx->gop_size      = m_AVIMOV_GOB;      // Intra frames per x P frames
ctx->pix_fmt       = AV_PIX_FMT_YUV420P;//Do not change this, H264 needs YUV format not RGB

与之前的答案一样,这里是 FFMPEG 库将 RGB 帧编码为 H264 视频的工作示例:

http://www.imc-store.com.au/Articles.asp?ID=276

对您的代码的额外思考:

你有没有像下面这样注册过?

avcodec_register_all();

av_register_all();

如果您没有在代码开头附近调用这两个函数,您对 FFMPEG 的后续调用将会失败,并且您很可能会出现段错误。

看看链接的例子,我在 VC++2010 上测试过,效果很好。

【讨论】:

ffmpeg 没有找到 vcodec libx264

】ffmpeg没有找到vcodeclibx264【英文标题】:ffmpegnotfindingvcodeclibx264【发布时间】:2011-06-1121:40:48【问题描述】:我已安装最新的ffmpeg,但似乎无法找到视频编解码器。我是否需要完全删除ffmpeg并重新运行./configure以使ffmpeg找到视频... 查看详情

cygwin 上的 FFMPEG 无法编译 libx264 错误:未知类型名称“HMODULE”

】cygwin上的FFMPEG无法编译libx264错误:未知类型名称“HMODULE”【英文标题】:FFMPEGoncygwinfailedtocompilelibx264error:unknowntypename‘HMODULE’【发布时间】:2017-12-2404:00:28【问题描述】:我正在尝试在cygwin环境下在ffmpeg中编译libx264。我遵... 查看详情

ffmpeg libx264 AVCodecContext 设置

】ffmpeglibx264AVCodecContext设置【英文标题】:ffmpeglibx264AVCodecContextsettings【发布时间】:2012-02-2816:32:49【问题描述】:我正在使用最近的Windows(2011年1月)ffmpeg版本并尝试在H264中录制视频。使用以下设置可以在MPEG4中正常录制:c-&g... 查看详情

ffmpeg/libx264 C API:从短 MP4 末尾丢弃的帧

】ffmpeg/libx264CAPI:从短MP4末尾丢弃的帧【英文标题】:ffmpeg/libx264CAPI:framesdroppedfromendofshortMP4【发布时间】:2017-12-2323:28:03【问题描述】:在我的C++应用程序中,我拍摄了一系列JPEG图像,使用FreeImage处理它们的数据,然后使用ffmp... 查看详情

androidffmpeg——ffmpeg+libx264编译(代码片段)

前面博客AndroidFFMpeg(一)——编译FFmpeg中记录了在windows中利用MinGW和Msys编译FFMpeg的步骤。FFMpeg中带有264的解码,没有264的编码,需要编码功能的话,可以使用x264这个库。准备编译环境win10中内置了Linux子系统&... 查看详情

windows下ffmpeg+x264编译,解决“libx264notfound”问题

参考技术A【问题】【解决方案】通过设置x264 的 PKG_CONFIG_PATH,用以解决x264头文件的路径,解决x264依赖库的位置路径问题。 查看详情

使用 ffmpeg libav 和 libx264 从图像创建视频?

】使用ffmpeglibav和libx264从图像创建视频?【英文标题】:Creatingavideofromimagesusingffmpeglibavandlibx264?【发布时间】:2013-07-2221:32:01【问题描述】:我正在尝试使用ffmpeg库从图像创建视频。这些图像的大小为1920x1080,应该使用.mkv容器... 查看详情

ffmpeg推流时,可能出现错误:unknownencoder'libx264'

使用如下命令推流时:p.p1margin:0.0px0.0px0.0px0.0px;font:18.0pxMenlo;color:#4d2f2d;background-color:#dfdbc3span.s1ffmpeg-re-ia.mp4-vcodeclibx264-acodecaac-fflvrtmp://172.31.102.165:1935/myapp 可能会出现如下错误 查看详情

ffmpeg中使用libx264的码率控制(代码片段)

  两种码率控制模式:crf模式和ABR模式一、crf模式  ConstantRateFactor(crf)优点是提供了最大的压缩效率,每一帧可以按照要求的视频质量去决定它需要的比特数。缺点是,不能计算规定时间的视频文件大小,或者准... 查看详情

如何解决“错误:找不到 libx264”?

...:2014-09-2414:14:07【问题描述】:我需要安装支持libx264的ffmpeg以启用H.264编码。我使用以下脚本成功安装了libx264,并使用了android-ndk-r9d中提供的工具链。#!/bin/bashNDK=~/android-ndk-r9dSYS 查看详情

ios编译libx264+libfdk-aac+ffmpeg

最近在学习FFmpeg,感觉基本流程还算清楚明白,不过之前一直是在Mac环境下学习,一个brewinstall一步搞定,不过我最终的项目是在iOS上,所以今天就试着编译了一下iOS环境下的FFmpeg,还好网上有这方面的文... 查看详情

未知编码器“libx264”

...间】:2012-04-0314:49:42【问题描述】:我在ubuntu11上安装了ffmpeg0.8.9./configure--enable-gpl--enable-nonfree--enable-pthreads--enable-libfaac--enable-libmp3lame--enable-libx264当我运行它时ffm 查看详情

vs2012mingw编译ffmeg引用外部库libx264,librtmp

VS2012如何编译ffmpeg前面已经有文章讲过,本来主要讲述如何引用外部库libx264,librtmp,ffmpeg版本是3.0.2。1. 下载x264源文件并编译     源码地址是http://www.videolan.org/developers/x264.html。libx264配置、编译命令如下... 查看详情

在配置 ffmpeg 时出现错误“未找到 x264”

】在配置ffmpeg时出现错误“未找到x264”【英文标题】:whileconfiguringffmpegigettheerror"x264notfound"【发布时间】:2021-04-2509:21:46【问题描述】:我使用mingw32编译带有libx264的ffmpeg。我使用以下配置:./configure--enable-gpl--enable-nonfre... 查看详情

开启ffmpeg+libx264软解码的多线程特性(代码片段)

之前编译的FFmpeg+libx264可以实现分辨率为1920*1080的H264视频流的软解码,经过测试,随着码率的提高,解码效率会降低,导致解码速率跟不上实际帧率。查找资料发现FFmpeg软解码支持多线程特性,程序上不用做修改,只是在软解码... 查看详情

libx264开发笔记:libx264介绍海思平台移植编译(代码片段)

...合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…&# 查看详情

关于在ubuntu14.04下编译安装ffmpeg

首先下载ffmpeg-2.4.3.tar.bz2和last_x264.tar.bz2,可以见附件。cd~mkdirffmpeg&&cdffmpeglibx264需要yasm,所以先安装yasmsudoapt-getinstallyasm然后安装libx264sudoaptitude-yinstall libx264-dev把两个附件拷贝到当前路径下并解压进入到x264-s 查看详情

使用 x264 为 Android 构建 FFMPEG

】使用x264为Android构建FFMPEG【英文标题】:BuildFFMPEGwithx264forAndroid【发布时间】:2012-02-0710:17:06【问题描述】:我正在尝试使用libx264forAndroid构建FFMPEG。我可以成功构建和使用适用于Android的FFMPEG,但我意识到我需要编码能力,因... 查看详情