Парсинг битвстрима хэвк

Есть ли способ для анализа файла битового потока HEVC?

Я хочу иметь возможность создать новый файл битового потока, выбрав пакеты из nal единиц, выбранных из исходного файла битового потока.

Изменить: я вставил свой код. Пожалуйста, найдите мой файл битового потока здесь.

#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

2 ответа

Решение

Если все, что вы хотите сделать, это взять несколько пакетов по одному блоку (например, в зависимости от идентификатора уровня и временного идентификатора), и вам не нужно изменять VPS, SPS, PPS, заголовок слайса и т. Д., То вы также можете легко реализовать это сам:

Соответствующий синтаксис указан в Приложении B "Формат байтового потока" стандарта HEVC.

Короче:

  1. Найдите в файле потока битов шаблон 0x000001, который разделяет все конечные единицы. Кроме того, перед этим шаблоном может быть байт 0x00, если следующая конечная единица является первой конечной единицей единицы доступа (единица доступа = все конечные единицы для декодирования целого кадра).

  2. Прочитайте заголовок конечной единицы в соответствии с разделом 7.3.1.2 стандарта HEVC и сохраните / удалите конечные единицы на основе любых критериев, которые вы хотите. Убедитесь, что вы сохраняете наборы параметров (все типы блоков 32, 33 и 34 в соответствии с таблицей 7-1 стандарта HEVC).

  3. Соберите все конечные единицы в новый файл и убедитесь, что между ними всегда есть последовательность 0x000001.

Однажды я делал нечто подобное, используя Python, который работал довольно хорошо. Если вы хотите упростить чтение заголовков внутренних блоков, используйте модуль цепочки битов. Если вы хотите сделать это и у вас есть более подробные вопросы, вы можете обратиться ко мне за помощью, если хотите.

Изменить: Относительно кода, который вы разместили: Почему вы ставите "-8" при назначении позиции в объекте BitStream (s.pos =pcks[0]-8 а также s.pos = pcks[1]-8)? Это должно быть +24 (24 бита = 3 байта = длина двоичного разделителя 0x000001), чтобы начать чтение после разделителя, чтобы получить конечную единицу. Тем не менее, вы должны принять это во внимание при чтении данных: no_p = pcks[1]-pcks[0] должно быть no_p = pcks[1]-pcks[0]-24потому что вы начинаете читать после разделителя.

Если вы запутались, что первая найденная позиция (pcks[0]) равен 8, а не 0: перед каждым разделителем конечных единиц может быть произвольное число нулевых байтов, согласно приложению B стандарта HEVC. Обычно перед каждым блоком доступа всегда есть один нулевой байт.

Вы можете попробовать GStreamer. У них есть плагин для разбора H.265/HEVC. Просто плагин довольно новый, так что я не уверен, насколько он стабилен сейчас.

Вы можете получить более подробную информацию здесь.

Другие вопросы по тегам