LINUX.ORG.RU

декодировать поток НЕ Annex B

 ,


0

1

У меня есть поток с камеры Samsung SNB-5004P, кодек H264, однако там судя по всему без Annex B. Принимаю по RTSP (при помощи live555/OpenRTSP). Вот как кадры начинаются:

raw= "67640028ACB402802DC8"
frame 0 sz= 10 decoded= false
raw= "68EE01AE2C00"
frame 1 sz= 6 decoded= false
raw= "65B845DFDAB69E13D5876BE6876E81503656D987E459CDF4"
frame 2 sz= 14771 decoded= false
raw= "21E220DBB22B0001ED8FB94F74340D6CE9441EA80E0AABE6"
frame 3 sz= 6005 decoded= false
raw= "21E420D3C06600D23D43F9738DECB0E68FC0AAEF86B2545D"
frame 4 sz= 20843 decoded= false
raw= "21E620C3B7AD83175C0FFFB44BDF0AAC6ADC010E03D0350E"
frame 5 sz= 25359 decoded= false

У меня есть свой код на базе libav и avcodec_decode_video2 не может декодировать такие кадры. Если они Annex B то может без проблем.

Вопрос: можно ли преобразовать поток, добавить заголовки к каждому NAL чтобы был формат Annex B? А может avcodec_decode_video2 можно заставить кушать такой поток?

Ответ на: комментарий от Krieger_Od

Надо подумать, может это и есть решение. Также я видел пример опции avconv которая делает annex-b поток без перекодирования...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от Krieger_Od

Решил просто... :)

Задействовал через QProcess тупо gstreamer и результат его работы вываливаю в stderr, т.к. сжатое то потоки небольшие и это хорошо работает:

QProcess gst;
gst.closeReadChannel(QProcess::StandardOutput);
gst.closeReadChannel(QProcess::StandardError);
connect(&gst, SIGNAL(readyReadStandardError()), this, SLOT(read_h264()));
gst.start("gst-launch-0.10 rtspsrc location=rtsp://192.168.127.100:554/udpstream_ch1 ! rtph264depay ! fdsink fd=2");
gst.waitForStarted();

Тема решена. Всё что приходит в gst.readAllStandardError() начинается с 0x00000001 и прекрасно декодируется моим старым кодом на базе libav.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

тупо gstreamer

Это не тупо, это дополнительные непростые зависимости к твоему софту (разные элементы gstreamer идут в разных пакетах, поведение в 0.10 и 1.x разное).

Krieger_Od ★★
()
Ответ на: комментарий от Krieger_Od

У меня OpenEmbedded, наполнение сборки я прописываю, все плагины какие надо - все есть ;)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Ну там же перед каждым NALU в AVCC идёт его размер, Annex B по сути отличается тем, что вместо размера стоит 3- или 4-байтный маркер 0x00 0x00 0x00 0x01, ну для контейнеров ещё метаданные нужно немного другим образом обрабатывать, у тебя же голый поток, тебе это, вроде как, не нужно. Вот и заменяешь размер на маркер, там даже его выравнивание таким же останется.

mix_mix ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.