簡體   English   中英

FFmpeg無法解碼H264流/幀數據

[英]FFmpeg can't decode H264 stream/frame data

最近我有機會使用兩台通過RTSP流式傳輸H264的設備。 我嘗試使用FFmpeg庫解壓縮此流時遇到了一些問題。

每次調用“ avcodec_decode_video2 ”時 - FFmpeg只是說:

[h264 @ 00339220]沒有框架!

我的原始H264流I幀數據開始如下:“ 65 88 84 21 3F F8 F8 0D ...”(據我所知,這個0x65表示它是一個IDR幀?)

一台設備的其他框架開始如下:“ 41 9A 22 07 F3 4E 48 CC ....”

和其他設備 - 像這樣:“ 61 9A 25 C1 1C 45 62 39 ....”

  • 我在這里錯過了一些幀數據嗎?
  • FFmpeg是否需要設置一些額外的參數?

我期待幀數據開始時至少有“ 00 00 00 01 ”字節......但這就是我所擁有的......

好的,設法使事情有效。

  • 在將幀發送到FFmpeg之前,我需要為幀數據包含序列(SPS)和圖像參數集(PPS)。
  • 我需要在SPS和PPS數據之后添加4個額外字節“00 00 00 01”。

這是一張顯示我的意思的小圖片: 在此輸入圖像描述

字節“65 88 ...”是我的原始幀數據開始的地方。

此SPS和PPS信息未包含在RTP數據包中。 我正在使用Live555庫進行RTSP流式傳輸,因此我使用了子集“ fmtp_spropparametersets ”功能來獲得我需要的東西。 此信息是Base64編碼的。 (示例: 像這樣的東西“Z0KAKNoC0EkQ,aM48gA ==” )請注意,有兩個“參數”SPS和PPS由“,”分隔,並且這些參數沒有包含“00 00 00 01”,所以你需要添加它們。

一些代碼示例(我在這里使用Qt庫):

QByteArray        ba          = pSubSession->fmtp_spropparametersets();
QList<QByteArray> recordsList = ba.split(',');

for (int i = 0; i < recordsList.size(); i++)
{
   mExtraData.append(char(0x00));
   mExtraData.append(char(0x00));
   mExtraData.append(char(0x00));
   mExtraData.append(char(0x01));

   mExtraData += QByteArray::fromBase64(recordsList.at(i));
}

現在,對於每一幀我做這樣的事情:

QByteArray ba = QByteArray(4, 0); // Prepare the "00 00 00 01"
           ba[3] = 0x01;

mpTrackVideo->buffer.insert(0, mExtraData);
mpTrackVideo->buffer.insert(mExtraData.size(), ba);

一年前我以為我在我的項目中集成了H264流支持,直到我有機會用其他設備測試它...所以你需要記住,有些設備可能會為每個I幀發送SPS和PPS數據。 ..有些人可能不會!

暫無
暫無

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

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