sza*_*ary 19 c x264 libavcodec libav libx264
我试图使用libavcodec/libavformat编码视频.音频效果很好,但当我尝试编码视频时,我收到以下错误:
[libx264 @ 0x10182a000]broken ffmpeg default settings detected
[libx264 @ 0x10182a000]use an encoding preset (vpre)
Run Code Online (Sandbox Code Playgroud)
使用命令行ffmpeg很容易修复,但我想在C中执行此操作.我的选项是
AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0);
AVCodecContext *pVideoOutCodecCtx = pVideoOutStream->codec;
pVideoOutCodecCtx->codec_id = CODEC_ID_H264;
pVideoOutCodecCtx->codec_type = CODEC_TYPE_VIDEO;
pVideoOutCodecCtx->bit_rate = pVideoInCodecCtx->bit_rate;
pVideoOutCodecCtx->width = pVideoInCodecCtx->width;
pVideoOutCodecCtx->height = pVideoInCodecCtx->height;
pVideoOutCodecCtx->pix_fmt = pVideoInCodecCtx->pix_fmt;
pVideoOutCodecCtx->sample_rate = pVideoInCodecCtx->sample_rate;
pVideoOutCodecCtx->gop_size = 30;
Run Code Online (Sandbox Code Playgroud)
但是avcodec_open()失败了.
我需要设置哪些其他值才能使x264满意?
Ser*_*pus 25
不要忘记使用x264私有选项.您始终可以设置个人资料:
av_dict_set(&This->opts, "vprofile", "baseline", 0)
Run Code Online (Sandbox Code Playgroud)
或者设置最低的编码延迟:
av_dict_set(&This->opts, "tune", "zerolatency", 0);
Run Code Online (Sandbox Code Playgroud)
或者选择一个预设:
av_dict_set(&This->opts, "preset","ultrafast",0);
Run Code Online (Sandbox Code Playgroud)
在打开编解码器之前
avcodec_open2(This->context, This->codec, &This->opts)
Run Code Online (Sandbox Code Playgroud)
Pad*_*ada 15
以下是如何解释ffmpeg的x264预设.
不幸的是,我不知道像ffmpeg那样导入预设的简单方法.您可以查找存储在/usr/local/share/ffmpeg/libx264-{name}.ffpreset中的x264预设值,其中为ffmpeg指定{name}作为-vpre {name}命令行参数.所以通常ffmpeg会包含libx264-medium.ffpreset,然后是libx264-main.ffpreset,指定为ffmpeg -vpre medium -vpre main
您可以通过查看libavcodec/options.c文件来查找所有选项(如libx264- {name} .ffpreset文件中所定义)以获取其结构名称,该文件可以在ffmpeg SVN存储库中找到.
以下是将介质和主要预设转换为C代码的方法:
// libx264-medium.ffpreset preset
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;c->flags2^=CODEC_FLAG2_8X8DCT; // flags2=-dct8x8
Run Code Online (Sandbox Code Playgroud)
如果要自动解析这些预设,则必须查看ffmpeg源代码.
我希望我刚给出的信息可以帮助你多一点:)
She*_*hea 10
不确定你是否正常工作,但以下参数对我有用.
ctx->bit_rate = 500*1000;
ctx->bit_rate_tolerance = 0;
ctx->rc_max_rate = 0;
ctx->rc_buffer_size = 0;
ctx->gop_size = 40;
ctx->max_b_frames = 3;
ctx->b_frame_strategy = 1;
ctx->coder_type = 1;
ctx->me_cmp = 1;
ctx->me_range = 16;
ctx->qmin = 10;
ctx->qmax = 51;
ctx->scenechange_threshold = 40;
ctx->flags |= CODEC_FLAG_LOOP_FILTER;
ctx->me_method = ME_HEX;
ctx->me_subpel_quality = 5;
ctx->i_quant_factor = 0.71;
ctx->qcompress = 0.6;
ctx->max_qdiff = 4;
ctx->directpred = 1;
ctx->flags2 |= CODEC_FLAG2_FASTPSKIP;
Run Code Online (Sandbox Code Playgroud)
当太多设置是默认的ffmpeg设置(例如)时,错误消息broken ffmpeg default settings detected显示在x264/encoder/encoder.c中的x264库中qmin = 2, qmax = 31, qcompress = 0.5,将这三个值更改为其他值,例如qmin = 10, qmax = 51, qcompress = 0.6,解决错误.
| 归档时间: |
|
| 查看次数: |
31749 次 |
| 最近记录: |