[英]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.