3

libavcodec(ffmpeg)を使用したプロジェクトがあります。メインレベルの4:2:2プロファイルでMPEG-2ビデオをエンコードするために使用しています。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;
}

結果のビデオフレームのスクリーングラブはhttp://ftp.limeboy.com/images/screen_grab.pngで見ることができます(入力は標準のカラーバーでした)。

プロセスのさまざまな時点でデバッグフレームをTGA形式に出力して確認しましたが、libavcodecがフレームをエンコードする時点までは、すべて問題なくダンディであることが確認できます。

どんな援助も大歓迎です!

乾杯、マイク。

4

1 に答える 1

5

OK、これは恥ずかしいです。

実際、私が設定した方法は正しいです。ffmpegのソースコードを見ると、4:2:2プロファイルと4:2:2クロマをエンコードするために必要なのは、着信ピクセル形式をPIX_FMT_YUV422Pに設定することだけであるように見えます。

問題の原因は?ある段階でビデオ解像度が32ビットから16ビットに変更された仮想マシンのVLCでビデオファイルを視聴していました。

それは正しい!ITはそれを変えました。私はそれを変更しませんでした-ITはそれを行いました!それ自体で、あなたは私を聞きます!

誰かがこの非問題を追いかけて時間を無駄にした場合はお詫び申し上げます。

于 2010-03-17T09:29:00.223 に答える