Como contabilizar a diferença de tempo com a codificação de fluxo em tempo real do FFMPEG?

0

Histórico: Estou usando o FFMPEG para combinar um fluxo de áudio e vídeo em um fluxo MPEGTS combinado na rede. O vídeo vem codificado em h264 a partir da câmera raspberry pi, o áudio vem ogg vorbis codificado a partir de uma placa de som em um fluxo TCP local. Um único processo FFMPEG cuida de codificar o áudio como AAC e combinar áudio / vídeo.

Comando

raspivid --nopreview --ev 10 -ih -t 0 -rot 180 -w 720 -h 480 -fps 30 -b $BITRATE -g $KEYFRAME_PERIOD -pf baseline -o - | ffmpeg -r 30 -i - -i tcp://127.0.0.1:3000 -vcodec copy -acodec libfdk_aac -b:a 64k -ac 2 -filter:a "atempo=0.9945" -f mpegts tcp://192.168.42.2:6000

Problema: Eu tive um problema com a dessincronização de áudio e vídeo ao longo do tempo. Eu fixei a diferença de tempo inicial ajustando o driver da placa de som, no entanto, com o tempo, os fluxos ainda podem ficar muito lentamente sem sincronização: o áudio é reproduzido um pouco mais rápido que o vídeo. Permitir que ele seja executado eventualmente faz com que o buffer de reprodução reaplique o áudio, resultando no aumento da latência do vídeo.

A razão para este deslocamento de tempo é provavelmente que a placa de som roda em seu próprio relógio um pouco diferente da do pi de framboesa. Eu consegui reduzir esse problema usando o filtro de áudio atempo . No entanto, considerando que isso pode ocorrer durante horas a dias, é inadequado, pois a velocidade do relógio de cristal varia.

Pergunta: Considerando que o áudio vem como um fluxo de áudio, eu queria saber se existe uma maneira de ajustar automaticamente o tempo para manter constante o tempo de amostra de áudio em buffer? Algo que faz o FFMPEG manter um fluxo contínuo de áudio, mantendo x segundos no buffer a todo momento, diminuindo a velocidade de reprodução se estiver no buffer. O tempo é a chave aqui: se o andamento não for alterado, haverá problemas durante a reprodução quando o áudio e o vídeo forem combinados.

Eu não posso usar métodos de sincronização padrão porque o fluxo do h264 não tem registro de data e hora, e os timestamps do fluxo ogg têm um problema de tempo.

Quaisquer sugestões para resolver isso são bem-vindas.

    
por berger 31.12.2016 / 21:10

0 respostas