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