18

最近、RTSP を介して H264 をストリーミングしている 2 つのデバイスで作業する機会がありました。そして、FFmpeg ライブラリを使用してこのストリームを解凍しようとして、いくつかの問題に遭遇しました。

「 avcodec_decode_video2 」が呼び出されるたびに、FFmpeg は次のように言います。

[h264@00339220] 枠なし!

生の H264 ストリームIフレームデータは次のように始まります。

1 つのデバイスの他のフレームは、「41 9A 22 07 F3 4E 48 CC....」のように始まります。

他のデバイスの場合 - 「61 9A 25 C1 1C 45 62 39....」のように

  • ここでフレームデータが欠落していますか?
  • FFmpeg には追加のパラメーターを設定する必要がありますか?

フレームデータの開始時に少なくとも「00 00 00 01」バイトを期待していました...しかし、これは私が得たものです..

4

1 に答える 1

19

わかりました、何とか機能させることができました。

  • フレームを FFmpeg に送信する前に、フレーム データのシーケンス (SPS) と画像パラメーター セット (PPS) を含める必要がありました。
  • SPS および PPS データの後に 4 バイト「00 00 00 01」を追加する必要がありました。

ここに私が何を意味するかを示す小さな写真があります: ここに画像の説明を入力

バイト "65 88..." は、元のフレーム データが始まる場所です。

この SPS および PPS 情報は、RTP パケットには含まれていませんでした。私は RTSP ストリーミングに Live555 ライブラリを使用しているので、サブセッション " fmtp_spropparametersets " 関数を使用して必要なものを取得しました。この情報は Base64 でエンコードされています。(サンプル: "Z0KAKNoC0EkQ,aM48gA==" のようなもの) "," で区切られた 2 つの "パラメーター" 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);

1 年前、他のデバイスでテストする機会が得られるまで、プロジェクトに H264 ストリーム サポートが統合されていると思っていました。 ..そうでない人もいるかもしれません!

于 2012-07-05T09:20:51.847 に答える