LINUX.ORG.RU

[C\C++] Формирование правильного MPEGTS-потока для IPTV


0

1

Добрый день всем. Есть такая задумка: Транслировать видео-поток с вебкамеры на iptv приставку. Я пробовал дописать плагин к mjpeg_streamer для того, чтобы формировался правильных mpegts поток, но почему-то этот поток не принимается даже в VLC, точнее не отображает видео.В этом плагине происходит вещание jpeg-фреймов, обернутых в mpegts пакеты. Что может происходить не так? Может быть такая концепция вообще не подходит? Существуют ли готовые бесплатные решения?

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

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

unklave
() автор топика
Ответ на: комментарий от unklave

То, что проц грузиться - это нормально. В MPEG-TS же jpeg не передашь, вот оно и декодируется в mpeg.

А vlc показывает? Запусти vlc -vvv. Возможно, станет ясно, почему нет.

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

Для теста сделал так:
1. создается mpeg2 файл, состоящий только из видео. Его я делаю в коде на С с помощью кодека из ffmpeg/libavcodec.
2. Читаются данные из файла и формируется mpegts поток: т.е. рассылаю по адресу 224.0.0.1 udp-пакеты, каждый из которых состоит из 7 пакетов данных.
Их я формирую вот так:

packet[0] = 0x47; // байт синхронизации
packet[1] = 0x0; // set PSI as 'payload unit start indicator' and
packet[2] = 0x34; // PID = 0x34
// set flags: scrambled(no), payload(yes), adaptation(no); and 'continuity counter' to counter
packet[3] = 0x10 | (counter & 0x0f);

дальше идет 184 байта данных
3. в wireshark я смотрю, что пакеты похожи на обычный mpegts iptv поток
4. при запуске vlc -vvv udp://224.0.0.1:1234 вывод вот такой:


VLC media player 1.1.3 The Luggage (revision exported)
...
[0x9baf964] main interface debug: TIMER module_need() : 9.371 ms - Total 9.371 ms / 1 intvls (Avg 9.371 ms)
[0x9bb50b4] main playlist debug: adding item `udp://224.0.0.1:1234' ( udp://@224.0.0.1:1234 )
[0x9bb437c] main interface debug: looking for interface module: 1 candidate
...
[0x9bb50b4] main playlist debug: starting new item
[0x9bb50b4] main playlist debug: creating new input thread
[0x9dff324] main input debug: Creating an input for 'udp://224.0.0.1:1234'
[0x9dff324] main input debug: thread (input) created at priority 10 (input/input.c:214)
[0x9dff324] main input debug: thread started
[0x9dff324] main input debug: using timeshift granularity of 50 MiB
[0x9dff324] main input debug: using timeshift path '/tmp'
[0x9dff324] main input debug: `udp://@224.0.0.1:1234' gives access `udp' demux `' path `@224.0.0.1:1234'
[0x9dff324] main input debug: creating demux: access='udp' demux='' path='@224.0.0.1:1234'
[0x9e04a1c] main demux debug: looking for access_demux module: 0 candidates
[0x9e04a1c] main demux debug: no access_demux module matched "udp"
[0x9e04a1c] main demux debug: TIMER module_need() : 1.593 ms - Total 1.593 ms / 1 intvls (Avg 1.593 ms)
[0x9dff324] main input debug: creating access 'udp' path='@224.0.0.1:1234'
[0x9e04a1c] main access debug: looking for access module: 1 candidate
[0x9e04a1c] access_udp access debug: opening server=:0 local=224.0.0.1:1234
[0x9e04a1c] main access debug: net: opening 224.0.0.1 datagram port 1234
[0x9e04a1c] main access debug: Multicast group join request
[0x9e04a1c] main access debug: using access module "access_udp"
[0x9e04a1c] main access debug: TIMER module_need() : 1.286 ms - Total 1.286 ms / 1 intvls (Avg 1.286 ms)
[0x9e05204] main stream debug: Using AStream*Block
[0x9e05204] main stream debug: pre buffering
[0x9e05204] main stream debug: received first data after 0 ms
[0x9e05204] main stream debug: prebuffering done 1316 bytes in 0s - 2505 KiB/s
[0x9e05a0c] main stream debug: looking for stream_filter module: 5 candidates
[0x9e05a0c] main stream debug: no stream_filter module matching "any" could be loaded
[0x9e05a0c] main stream debug: TIMER module_need() : 4.802 ms - Total 4.802 ms / 1 intvls (Avg 4.802 ms)
[0x9e05a0c] main stream debug: looking for stream_filter module: 1 candidate
[0x9e05a0c] main stream debug: using stream_filter module "stream_filter_record"
[0x9e05a0c] main stream debug: TIMER module_need() : 0.489 ms - Total 0.489 ms / 1 intvls (Avg 0.489 ms)
[0x9dff324] main input debug: creating demux: access='udp' demux='' path='@224.0.0.1:1234'
[0x9e05b9c] main demux debug: looking for demux module: 52 candidates
[0x9e05b9c] ts demux debug: pid[52] unknown
Warning: call to rand()
[0x9bb0c24] qt4 interface debug: IM: Setting an input
Warning: call to rand()
Warning: call to rand()

unklave
() автор топика
Ответ на: комментарий от unklave

MPEG-TS сложнее того, что вы привели. Там обязательно должны быть PAT и PMT таблицы. Еще должен быть PCR(обычно в адаптейшен филдах у видео-пидов). В Payload Mpeg-Ts'а лежит PES, а не голый mpeg-2.

В общем, лучше ffmpeg'ом сразу mpeg-ts генерить, а не просто mpeg-2.

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

кхм....понятно...
а есть какая-нибудь библиотека, которая уже по готовому mpeg2 потоку генерировала mpeg-ts(со всеми таблицами, pid'ами итд)?
некоторое время назад появилась железка, которая может кодировать сразу mpeg2/dvd видеопоток.

хотелось бы теперь его заворачивать в mpegts и рассылать без перекодирования.

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