Dependências do Elemento GStreamer: Como conectar o playbin ao hlssink?

1

Sou novo no GStreamer e tenho tentado construir alguns pipelines simples usando o gst-launch-1.0. Estou com dificuldade em descobrir quais elementos precisam estar juntos. Por exemplo, quero transmitir um vídeo da web para uma tag de vídeo HTML5 em um navegador. Para abrir e ler o arquivo, acho que preciso usar o playbin:

gst-launch-1.0 playbin uri=file:///home/ubuntu/g-streamer-lively/skyrim.webm ...

Então para disponibilizar o arquivo eu uso o hlssink:

! hlssink max-files=5  playlist-root=http://10.12.9.3/ location=/var/www/html/hlssink.webm

Então, no meu navegador, uso a tag de vídeo:

<video src="http://10.12.9.3/hlssink.webm" controls>

Portanto, esse pipeline não será iniciado e recebo o seguinte erro:

WARNING: erroneous pipeline: could not link playbin0 to hlssink0

Então me diz que não posso ligar esses dois elementos. Tudo bem, mas onde procurar os outros elementos que preciso incluir no meu pipeline para fazer isso funcionar?

Desde já, obrigado.

Przemek Lach
fonte

Respostas:

0

Eu acho que você deveria parar e ler um pouco a documentação do gstreamer para entender como funciona. O GStreamer é uma estrutura para construir um gráfico para processamento de dados. Você pode encontrar o manual aqui: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html

O Playbin é um elemento especial (um bin) e irá montar um pipeline interno para você. O Playbin não expõe nenhum bloco de links, pois ele é projetado para criar um pipeline completo de reprodução, e é por isso que você não pode vinculá-lo ao hlssink.

Você pode usar outros elementos para criar um pipeline para transcodificar sua entrada do webm no hlssink, por exemplo, você pode usar o uridecodebin que é outro bin que criará automaticamente um pipeline de decodificação para qualquer mídia usada (desde que você tenha os plugins corretos para isso) ). Algo como:

gst-launch-1.0 uridecodebin uri=<youruri> name=decbin ! queue ! videoconvert ! x264enc ! tsmux name=muxer ! hlssink decbin. ! queue ! audioconvert ! faac ! muxer.

Eu não testei, mas algo assim deve funcionar para converter sua entrada para mpegts usando H264 e AAC, por exemplo, e passar os dados para o hlssink.

Para verificar quais elementos você possui em seu sistema, use a ferramenta gst-inspecionar-1.0. Ele irá listar todos os elementos se você não der um argumento ou dar detalhes sobre um elemento em particular se você der um, como:

gst-inspect-1.0 hlsssink

EDIT: consertar o pipeline que você propôs nos comentários

gst-launch-1.0 uridecodebin uri=file:///home/ubuntu/g-streamer-lively/skyrim.webm name=decbin ! queue ! videoconvert ! x264enc ! mpegtsmux name=muxer ! hlssink max-files=5 playlist-root=10.12.9.3 location=/var/www/html/hlssink decbin. ! queue ! audioconvert ! avenc_aac ! muxer.
thiagoss
fonte
Então eu li a documentação antes, mas ainda tenho dificuldade em descobrir a ordem dos elementos. Talvez seja porque eu não tenho experiência em edição de vídeo / áudio, então eu realmente não entendo o processo. Se eu quiser apenas transmitir um arquivo .webm por que eu tenho que fazer coisas como videoconvert, x264enc etc. Eu posso servir o arquivo .webm diretamente para o meu navegador via apache, por que eu preciso usar esses elementos extra gstreamer para simplesmente mover o arquivo através de um pipeline simples?
Przemek Lach
Eu tentei usar o seu pipeline e tive que mudar algumas coisas: gst-launch-1.0 uridecodebin uri = arquivo: ///home/ubuntu/g-streamer-lively/skyrim.webm name = decbin! fila ! videoconvert! x264enc! mpegtsmux name = muxer! hlssink decbin. ! fila ! audioconvert! avenc_aac! muxer. ! hlssink max-files = 5 playlist-raiz = 10.12.9.3 localização = / var / www / html / hlssink.webm. Agora, quando tento iniciar, recebo o erro: WARNING: pipeline errônea: link sem elemento de origem.
Przemek Lach
você não está "movendo" um arquivo através do pipeline, ele será processado em cada nó. Quando você usar o uridecodebin, ele demodificará e decodificará seu arquivo de entrada, presumindo que você tenha tanto vídeo quanto áudio, você obterá 2 saídas dele. Cada um está sendo reencodificado com um novo formato para obter muxed em mpegts, que geralmente é o que é servido pelo protocolo HLS que você queria usar.
thiagoss
Seu pipeline está errado, existem duas instâncias do hlssink criadas e não tenho certeza se você entende o que é o HLS e como ele funciona pelos parâmetros que você está selecionando. O HLS criará uma lista de reprodução de pequenos arquivos para download e reprodução sequencial.
thiagoss
Oi obrigado pela edição. Eu tentei o seu novo pipeline e recebo o seguinte erro: ERROR: do elemento / GstPipeline: pipeline0 / avenc_aac: avenc_aac0: o Codec é experimental, mas as configurações não permitem que os codificadores produzam uma saída de qualidade experimental. Tentei descobrir onde posso definir "qualidade experimental", mas não consegui encontrá-la. Estou perdendo uma bandeira ou algo assim?
Przemek Lach