プログラムで 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/
よろしく、