6

HEVC ビットストリーム ファイルを解析する方法はありますか?

元のビットストリーム ファイルから選択した最終ユニット パケットを含む新しいビットストリーム ファイルを作成できるようにしたいと考えています。

編集:コードを挿入しました。ここでビットストリーム ファイルを見つけてください。

#library for searching in a string
import re

#library to keep dictionary order
import collections
import bitstring
from bitstring import BitStream, BitArray, ConstBitStream, pack
from bitstring import ByteStore, offsetcopy

#read bitstream file
s = BitStream(filename='11LTCCA_560x416_50Hz_8b_P420_GOP8_IP48_200frms_QP28.HEVC.str')

#find no of packets
pcks = list(s.findall('0x000001', bytealigned=True))

print len(pcks)

#set the current position, in the beginning of the nal unit.
s.pos =pcks[0]-8
print s.pos

#find the number of bits of first nal packet
no_p = pcks[1]-pcks[0]


forbidden_zero_bit = s.read(1)
nal_unit_type = s.read('uint:6')

# go to the beginning of the second nal unit
s.read(no_p)
# print nal unit type of the 1st packet
print nal_unit_type

no_p = pcks[2]-pcks[1]
s.pos = pcks[1]-8
print s.pos
forbidden_zero_bit = s.read(1)
nal_unit_type = s.read('uint:6')
s.read(no_p)
print nal_unit_type
4

2 に答える 2

9

いくつかの最終ユニット パケットを取得するだけで (たとえば、レイヤー ID と一時 ID に応じて)、VPS、SPS、PPS、スライス ヘッダーなどを変更する必要がない場合は、これを簡単に実装することもできます。あなた自身:

対応する構文は、 HEVC標準の付録B「バイトストリーム形式」に記載されています。

要するに:

  1. すべての最終ユニットを区切るパターン 0x000001 のビットストリーム ファイルを検索します。さらに、次の nal ユニットがアクセス ユニットの最初の nal ユニット (アクセス ユニット = フレーム全体をデコードするためのすべての nal ユニット) である場合、このパターンの前に 0x00 バイトが存在する可能性があります。

  2. HEVC 標準のセクション 7.3.1.2 に従って最終ユニット ヘッダーを読み取り、必要な基準に基づいて最終ユニットを保持/削除します。パラメーター セット ( HEVC 標準の表 7-1 に基づく最終ユニット タイプ 32、33、および 34) を保持していることを確認します。

  3. すべての最終ユニットを新しいファイルに集め、その間に常に 0x000001 シーケンスがあることを確認してください。

以前、Python を使用して同様のことを行ったことがありますが、これは非常にうまく機能しました。最終的なユニット ヘッダーを読みやすくしたい場合は、ビット文字列モジュールを使用します。これを行いたい場合や、より詳細な質問がある場合は、必要に応じて私に連絡してください。

編集: 投稿したコードについて: BitStream オブジェクト (s.pos =pcks[0]-8およびs.pos = pcks[1]-8) で位置を割り当てるときに「-8」を付けるのはなぜですか? これは +24 (24 ビット = 3 バイト = 最終単位セパレータの長さ 0x000001) である必要があり、最終単位を取得するためにセパレータの後に読み取りを開始します。ただし、データを読み取るときは、これを考慮に入れるno_p = pcks[1]-pcks[0]必要がありno_p = pcks[1]-pcks[0]-24ます。最終的な単位セパレータの後に読み取りを開始するためです。

最初に見つかった位置 ( ) が 0 ではなく 8 であることに混乱した場合: HEVC 標準pcks[0]の付属書 B に従って、各最終単位区切りの前に、任意の数のゼロバイトが存在する可能性があります。通常、各アクセス ユニットの前には常にゼロ バイトが 1 つあります。

于 2014-07-28T13:09:42.173 に答える
0

GStreamer を試すことができます。H.265/HEVC を解析するためのプラグインがあります。プラグインはまだかなり新しいので、現時点でどれだけ安定しているかはわかりません。

詳細については、こちらをご覧ください。

于 2014-07-18T19:18:23.307 に答える