簡體   English   中英

Libav轉碼為H264:丟幀

[英]Libav Transcoding to H264: Frames being dropped

抱歉,如果我的問題表達得不夠好,那么我才開始使用FFmpeg和Libav。 我對媒體格式也不太了解,在過去的一個月中,我幾乎了解了有關該主題的所有知識。 我一直在做盡可能多的研究,並且已經走了很遠,但是直到現在我幾乎不確定我的問題到底是什么! 這些更像是觀察,但是希望一些專家可以在這里幫助我。

我正在嘗試使用FFmpeg的庫將Gifs轉換為MP4,但是在使用H264編解碼器時遇到了一個奇怪的問題。 在我的代碼轉換循環中,我保留我寫出的幀數(通過驗證av_write_frame的返回值)。 在一個特定的樣本中,我算出總共寫入了166幀。 如果我使用FFprobe(我想用我的程序模擬的功能,從Gif到MP4的轉換)檢查FFmpeg的轉換文件,則FFmpeg的輸出文件似乎也有166幀,但是當我用FFprobe檢查輸出時,我似乎只有144幀。 我發現有點有趣的是,如果我只是將編解碼器從H264更改為MPEG4,則我的輸出似乎具有166幀,與FFmpeg的輸出和我的計數器匹配。 在不同的Gif文件中,我得到的結果非常相似,其中我寫入的幀計數器與FFmpeg輸出的幀計數匹配,但是我的輸出似乎丟失了一些幀。

編碼器設置:

ostream_codec_context->codec_id = CODEC_IN_USE;  //CODEC_ID_H264 or CODEC_ID_MPEG4
ostream_codec_context->pix_fmt = AV_PIX_FMT_YUV420P;
ostream_codec_context->codec_type = AVMEDIA_TYPE_VIDEO;
ostream_codec_context->flags = CODEC_FLAG_GLOBAL_HEADER;
ostream_codec_context->profile = FF_PROFILE_MPEG4_SIMPLE;

ostream_codec_context->gop_size = istream_codec_context->gop_size;
ostream_codec_context->time_base = istream_codec_context->time_base;

ostream_codec_context->width  = (istream_codec_context->width  / 2) * 2;
ostream_codec_context->height = (istream_codec_context->height / 2) * 2;    

轉碼循環:

我省略了一些錯誤檢查代碼和調試語句

avformat_write_header(oformat_context, NULL);
while (av_read_frame(iformat_context, &packet) == 0 ) 
{
   if (packet.stream_index == istream_index) 
   {   
      avcodec_decode_video2(istream_codec_context, ipicture, &full_frame, &packet);
      if (full_frame) 
      {
         sws_scale(image_conversion_context, 
                   (uint8_t const * const *) ipicture->data,
                   ipicture->linesize, 0, istream_codec_context->height,
                   opicture->data, opicture->linesize);

         opicture->pts = av_rescale_q(packet.pts, istream_codec_context->time_base,
                                      ostream->time_base);

         ret = avcodec_encode_video2(ostream_codec_context, &packet, 
                                     opicture, &got_packet);
         if (!ret)
         {
            ret = av_write_frame(oformat_context, &packet);
            if (ret < 0)
               num_frames_written++;
         }
      }
   }
   av_free_packet(&packet);
   av_init_packet(&packet);
}

我的輸出的比特率也有問題。 我可以嘗試用我的編碼器設置,其余的設置,但比特率FFprobe顯示是一樣的。我拿什么編解碼器上下文。 我嘗試將位速率設置為恆定值,只是為了查看它如何影響輸出,盡管我的輸出的位速率與給出的值不同,但是我發現我的輸入確實會影響輸出的實際位-率。 我發現有一篇帖子似乎在解決我的問題,但是那里列出的解決方案似乎無法解決我的問題。

http://ffmpeg.org/pipermail/libav-user/2012-July/002492.html

值得一提的另一件事是,我的各種時基似乎與FFmpeg的輸出不匹配。 值得注意的是,我的輸出的TBC似乎是我的輸出編解碼器上下文時基的兩倍。 我不太確定這是否是Gif文件格式的問題,我的輸出編解碼器上下文似乎總是設置為1/100。

比特率計算和設置

int calculated_br = istream_codec_context->time_base.den *     
                    avpicture_get_size(AV_PIX_FMT_YUV420P, ostream_codec_context->width, 
                                       ostream_codec_context->height);    

ostream_codec_context->bit_rate = calculated_br;
ostream_codec_context->rc_min_rate = calculated_br;
ostream_codec_context->rc_max_rate = calculated_br;
ostream_codec_context->rc_buffer_size = calculated_br;

我直覺所有這些問題可能與我沒有正確設置PTS / DTS有關,即使我的輸出的pts / dts值與FFmpeg的輸出匹配。

我將不勝感激,謝謝!

使用libx264進行輸出時,您可能需要手動重新調整時間戳,如我在此答案中所述 這可以解釋您的比特率問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM