gpt4 book ai didi

c++ - 如何使用 x264 与 ffmpeg 进行编码?

转载 作者:行者123 更新时间:2023-12-04 23:17:31 28 4
gpt4 key购买 nike

我尝试使用 ffmpeg 对视频进行编码/但它在 AVCodecContext 和 AVCodec 的初始化时失败。
我所做的:

_codec = avcodec_find_encoder(CODEC_ID_H264);
_codecContext = avcodec_alloc_context3(_codec);
_codecContext->coder_type = 0;
_codecContext->me_cmp|= 1;
_codecContext->me_method=ME_HEX;
_codecContext->me_subpel_quality = 0;
_codecContext->me_range = 16;
_codecContext->gop_size = 12;
_codecContext->scenechange_threshold = 40;
_codecContext->i_quant_factor = 0.71;
_codecContext->b_frame_strategy = 1;
_codecContext->qcompress = 0.5;
_codecContext->qmin = 2;
_codecContext->qmax = 31;
_codecContext->max_qdiff = 4;
_codecContext->max_b_frames = 3;
_codecContext->refs = 3;
_codecContext->trellis = 1;
_codecContext->width = format.biWidth;
_codecContext->height = format.biHeight;
_codecContext->time_base.num = 1;
_codecContext->time_base.den = 30;
_codecContext->pix_fmt = PIX_FMT_YUV420P;
_codecContext->chromaoffset = 0;
_codecContext->thread_count =1;
_codecContext->bit_rate = (int)(128000.f * 0.80f);
_codecContext->bit_rate_tolerance = (int) (128000.f * 0.20f);
int error = avcodec_open2(_codecContext, _codec, NULL);
if(error< )
{
std::cout<<"Open codec fail. Error "<<error<<"\n";
return NULL;
}

以这种方式,ii 在 avopen_codec2() 上失败:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xae1fdb70 (LWP 30675)]
0xb2eb2cbb in x264_param_default () from /usr/lib/libx264.so.120

如果我评论所有 AVCodecContext 参数设置 - 我有:
[libx264 @ 0xac75edd0] invalid width x height (0x0)

并且 avcodec_open 返回负值。我正在做的哪些步骤是错误的?

感谢您的帮助(ffmpeg 0.10 && libx264 昨天的每日快照)

最佳答案

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

AVStream *st;
m_video_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
st = avformat_new_stream(_outputCodec, m_video_codec);
_outputCodecContext = st->codec;
_outputCodecContext->codec_id = m_fmt->video_codec;
_outputCodecContext->bit_rate = m_AVIMOV_BPS; //Bits Per Second
_outputCodecContext->width = m_AVIMOV_WIDTH; //Note Resolution must be a multiple of 2!!
_outputCodecContext->height = m_AVIMOV_HEIGHT; //Note Resolution must be a multiple of 2!!
_outputCodecContext->time_base.den = m_AVIMOV_FPS; //Frames per second
_outputCodecContext->time_base.num = 1;
_outputCodecContext->gop_size = m_AVIMOV_GOB; // Intra frames per x P frames
_outputCodecContext->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 上对其进行了测试,它运行良好。

    关于c++ - 如何使用 x264 与 ffmpeg 进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880495/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com