1

プログラムで mp4 ビデオ ファイル (h264 コーデックを使用) を単一の RGB イメージに変換したいと考えています。コマンド ラインでは、次のようになります。

ffmpeg -i test1080.mp4 -r 30 image-%3d.jpg

このコマンドを使用すると、素敵な画像のセットが生成されます。しかし、プログラムで同じことをしようとすると、一部の画像 (おそらく B および P フレーム) が奇妙に見えます (たとえば、差分情報などで歪んだ領域があります)。読み取りと変換コードは次のとおりです。

AVFrame *frame = avcodec_alloc_frame();
AVFrame *frameRGB = avcodec_alloc_frame();

AVPacket packet;

int buffer_size=avpicture_get_size(PIX_FMT_RGB24, m_codecCtx->width,
    m_codecCtx->height);
uint8_t *buffer = new uint8_t[buffer_size];

avpicture_fill((AVPicture *)frameRGB, buffer, PIX_FMT_RGB24,
    m_codecCtx->width, m_codecCtx->height);

while (true)
{
    // Read one packet into `packet`
    if (av_read_frame(m_formatCtx, &packet) < 0) {
        break;  // End of stream. Done decoding.
    }

    if (avcodec_decode_video(m_codecCtx, frame, &buffer_size, packet.data, packet.size) < 1) {
        break;  // Error in decoding
    }

    if (!buffer_size) {
        break;
    }

    // Convert
    img_convert((AVPicture *)frameRGB, PIX_FMT_RGB24, (AVPicture*)frame,
        m_codecCtx->pix_fmt, m_codecCtx->width, m_codecCtx->height);

    // RGB data is now available in frameRGB for further processing
}

B および P フレームからの情報がすべてのフレームに含まれるように、各最終イメージがすべてのイメージ データを表示するようにビデオ ストリームを変換するにはどうすればよいですか?

[編集:]アーティファクトを示すサンプル画像はこちら: http://imageshack.us/photo/my-images/201/sampleq.jpg/

よろしく、

4

1 に答える 1

0

の 3 番目の引数がavcodec_decode_videonull 値を返す場合、それはエラーを意味しません。これは、フレームがまだ準備できていないことを意味します。値がゼロ以外になるまでフレームを読み続ける必要があります。

if (!buffer_size) {
    continue;
}

UPD

チェックを追加して、キー フレームのみを表示してみてください。問題を特定するのに役立ちます。

while (true)
{
  // Read one packet into `packet`
  if (av_read_frame(m_formatCtx, &packet) < 0) {
    break;  // End of stream. Done decoding.
  }

  if (avcodec_decode_video(m_codecCtx, frame, &buffer_size,
      packet.data, packet.size) < 1)
  {
    break;  // Error in decoding
  }

  if (!buffer_size) {
    continue; // <-- It's important!
  }

  // check for key frame
  if (packet.flags & AV_PKT_FLAG_KEY)
  {
    // Convert
    img_convert((AVPicture *)frameRGB, PIX_FMT_RGB24, (AVPicture*)frame,
      m_codecCtx->pix_fmt, m_codecCtx->width, m_codecCtx->height);
  } 
}
于 2013-01-09T08:38:30.390 に答える