2:2プロファイルMPEG-2 4のエンコード時に2クロマ:2:どのように私は4を使用するようにlibavcodecの設定するのですか?
-
20-09-2019 - |
質問
私はlibavcodecの(ffmpegのを)使用してプロジェクトを持っています。 2:2プロファイル、メインレベルIは4でMPEG-2ビデオをエンコードするためにそれを使用しています。 2:0クロマむしろ私は、しかし、私は取得していますビデオ出力が間違っているすべての色を持っており、それが4であると考えているかのように間違ってバッファを読んでいるエンコーダのように私には見えます、AVCodecContextで選択されたピクセルフォーマットのPIX_FMT_YUV422Pを持っています4より:2:2。ここに私のコーデックの設定があります:
//
// AVFormatContext* _avFormatContext previously defined as mpeg2video
//
//
// Set up the video stream for output
//
AVVideoStream* _avVideoStream = av_new_stream(_avFormatContext, 0);
if (!_avVideoStream)
{
err = ccErrWFFFmpegUnableToAllocateStream;
goto bail;
}
_avCodecContext = _avVideoStream->codec;
_avCodecContext->codec_id = CODEC_ID_MPEG2VIDEO;
_avCodecContext->codec_type = CODEC_TYPE_VIDEO;
//
// Set up required parameters
//
_avCodecContext->rc_max_rate = _avCodecContext->rc_min_rate = _avCodecContext->bit_rate = src->_avCodecContext->bit_rate;
_avCodecContext->flags = CODEC_FLAG_INTERLACED_DCT;
_avCodecContext->flags2 = CODEC_FLAG2_INTRA_VLC | CODEC_FLAG2_NON_LINEAR_QUANT;
_avCodecContext->qmin = 1;
_avCodecContext->qmax = 1;
_avCodecContext->rc_buffer_size = _avCodecContext->rc_initial_buffer_occupancy = 2000000;
_avCodecContext->rc_buffer_aggressivity = 0.25;
_avCodecContext->profile = 0;
_avCodecContext->level = 5;
_avCodecContext->width = f->GetWidth(); // f is a private Frame class with width, height properties etc.
_avCodecContext->height = f->GetHeight();
_avCodecContext->time_base.den = 25;
_avCodecContext->time_base.num = 1;
_avCodecContext->gop_size = 12;
_avCodecContext->max_b_frames = 2;
_avCodecContext->pix_fmt = PIX_FMT_YUV422P;
if (_avFormatContext->oformat->flags & AVFMT_GLOBALHEADER)
{
_avCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
if (av_set_parameters(_avFormatContext, NULL) < 0)
{
err = ccErrWFFFmpegUnableToSetParameters;
goto bail;
}
//
// Set up video codec for encoding
//
AVCodec* _avCodec = avcodec_find_encoder(_avCodecContext->codec_id);
if (!_avCodec)
{
err = ccErrWFFFmpegUnableToFindCodecForOutput;
goto bail;
}
if (avcodec_open(_avCodecContext, _avCodec) < 0)
{
err = ccErrWFFFmpegUnableToOpenCodecForOutput;
goto bail;
}
//ftp.limeboy:得られる映像フレームののscreengrabは HTTPで見ることができます。 COM /画像/ screen_grab.png に(入力が標準カラーバーであった)。
私はプロセスのさまざまなポイントで、TGA形式にデバッグフレームを出力することでチェックしました、と私はそれがすべての罰金であることを確認し、libavcodecのフレームを符号化する時点までダンディできます。
どのような援助が最も感謝!
乾杯、 マイクます。
解決
OK、これは恥ずかしいです。
実は、私はそれを設定していた道は正しいです。 ffmpegのためのソースコードを見ると、あなたがしなければならないすべてはそれをエンコードするために取得することが表示されます4:2:2プロファイルと4:2:2クロマはPIX_FMT_YUV422Pに入ってくるピクセルフォーマットを設定することです。
問題の原因?私はいくつかの段階で、16ビットに32ビットからそのビデオ解像度を変更した仮想マシンに戻ってVLCのビデオファイルを見ていました。
そうです! ITはそれを変更しました。私はそれを変更していない - それはそれをやりました!それ自体で、あなたは私を聞く!!
謝罪誰もがこの非問題を追いかけ、自分の時間を無駄にしている場合。