![](/img/trans.png)
[英]Caching AVFrames using av_read_frame in a loop only get last couple of frames
[英]Get 2 consecutives frames with av_read_frame()
我正在使用 rtmp 和 ffmpeg/libav。 我有一個 fps 為 60 fps 的剪輯,它由 2 個連續的視頻幀和 1 個音頻幀組成。 2 個連續的幀對應於來自 2 個攝像機的左右圖像(已經同步)。 我使用av_read_frame
讀取幀,然后如果它是視頻幀,我使用avcodec_decode_video2
(我知道它已被棄用,但它仍然有效,稍后我將替換它)。 現在,由於我必須將 2 個視頻幀並排放置,我等到 2 個幀被完全讀取,然后將它們與 OpenCV 放在一起。 問題是我似乎總是只讀取有時被右幀打斷的左幀。 我搜索了一下問題,似乎與解碼器的沖洗有關。 因此,我嘗試使用空包或使用avcodec_flush_buffers
刷新解碼器,但情況更糟,我得到左右圖像但只有幾幀。 在下面我放了一個我的代碼示例:
bool left = false;
while(true)
{
ret = av_read_frame(fmt_ctx, &pkt);
if(ret < 0)
break
if(pkt.stream_index == video_index)
{
ret = avcodec_decode_video2(video_dec_ctx, frame, &got_frame, &pkt);
if(got_frame)
{
if(!left)
{
//I SAVE THE LEFT FRAME
left = true;
}
else
{
//I PUT THE LEFT AND RIGHT FRAME TOGETHER
left = false;
}
}
}
}
更新
我想出了問題所在:基本上我要讀取的剪輯/流是由 1 個 I 幀和 P 幀組成的,它們實際上是 I 幀,因為每個幀代表左和右。 我無法使用av_read_frame
強制執行任何操作,因此我必須找到解決方法。
我猜相鄰的幀(左和右)可能有相同的 PTS 值。 您可以先緩沖幀,然后在正確獲取幀后根據 PTS 值獲取(查找相同的值),與它們相鄰可能很簡單。
希望有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.