Como transmitir MPEG-TS sobre UDP?

0

Estou usando o gstreamer para fazer streaming de um AppSink personalizado que imita o UdpSink. Estamos fazendo isso para que possamos incorporar a escuta em outras portas para alguns metadados. Além disso, o estoque UdpSink está quebrado. De qualquer forma, eu tive sucesso com o streaming de vídeo, mas os pacotes UDP parecem não estar empacotados corretamente. Eu estou querendo saber se eu perdi algum passo.

Aqui está meu canal de envio:

filesrc (mpeg TS file) ! displayQueue ! streamTee ! tsdemux ! decoder ! videosink

streamTee ! sendQueue ! udpSink (our custom one)

o fim de recepção:

UdpSrc (custom) ! queue ! mpegtsdemux ! queue ! (mpegdecode || h264decode) ! ... ! videosink

Streaming funciona. Mas parece muito frágil. Às vezes apenas para. Existem muitos artefatos.

Então, eu tentei o VLC. Eu configurá-lo para transmitir em unicast UDP. Isso funciona muito bem. Percebi que o VLC envia o vídeo de maneira diferente do meu pipeline. Eu usei o Wireshark para analisar os pacotes:

Protocolos usados: VLC: IP:UDP:MP2T (e PET , PMT pacotes e todos os outros tipos de coisas relacionadas a TS)

Meu: IP:UDP:Data

Parece que o pipeline que estou usando está apenas enviando vídeo bruto por UDP sem nenhuma correção de erro. o que estou perdendo? Os vídeos usados são h264 ou mpeg codificados com .mpg files.

Estou usando o gstreamer-java para programar os elementos personalizados UdpSink e UdpSrc, mas não posso usar o gstreamer no console para testar desde o estoque UdpSink está corrompido . Eu tentei um pipeline simples em uma VM Linux e recebi um pacote semelhante de pacotes como o VLC:

gst-launch-0.10 -v videotestsrc ! mpeg2enc ! mpegtsmux ! udpsink host=192.168.2.100 port=1234

    
por Nick 28.02.2013 / 18:03

1 resposta

1

Isso é apenas um pensamento, não estou muito familiarizado com o gstreamer, então não sei como o filesrc funciona, mas suponho que ele não entenda o MPEG-TS. O MPEG-TS requer pacotes para entrar em certos limites (geralmente 188 bytes). Eu tentaria colocar seu tee após o demux, então adicione um mpegtsmux antes de seu udpSink .

Eu percebo que isso vai fazer mais trabalho, então é realmente necessário (demux apenas para mux novamente), mas ele irá garantir que os pacotes estejam alinhados corretamente. Se funcionar e você precisar eliminar a sobrecarga, talvez seja necessário implementar uma fonte de arquivos mais inteligente.

    
por 28.02.2013 / 21:14