2013-01-08 46 views
1

我想以編程方式將mp4視頻文件(使用h264編解碼器)轉換爲單個RGB圖像。使用命令行,這看起來像:AVFrame到RGB - 解碼文物

​​

使用這個命令產生了很好的圖片集。但是,當我嘗試以編程方式做同樣的一些圖像(可能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/

問候,

回答

0

如果avcodec_decode_video第三個參數返回一個空值,這並不意味着該錯誤。這意味着該框架還沒有準備好。您需要繼續閱讀框架,直到值變爲非零。

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); 
    } 
} 
+0

感謝您的提示。我已經嘗試過,但結果是一樣的。我檢查了ffmpeg工具如何進行轉換,這涉及更多步驟。目前我正在試圖弄清楚究竟是什麼必要。 – Hyndrix

+0

你能分享帶有工件的示例圖像嗎? – pogorskiy

+0

您在這裏:http://imageshack.us/photo/my-images/201/sampleq.jpg/ – Hyndrix