FFmpeg e HLS várias reproduções de áudio

3

Estou tentando usar o FFmpeg para produzir uma playlist do HLS que contenha várias reproduções de áudio , mas não consigo obter o áudio & faixas de vídeo para sincronizar juntos. Aqui está o cenário:

  • Suponha que eu tenha 2 arquivos de vídeo, cada um com uma faixa de áudio
  • Eu uso o FFmpeg para reunir os dois vídeos para formar um único vídeo, por exemplo:

  • Afaixadeáudioextraídaparacadaarquivo(transcodificadocomo.mp3)

  • EuqueroproduzirumalistadereproduçãodeHLSondeasfaixasdeáudioalternativassãorespectivamenteoesquerdo&oáudiocerto:

Oproblemaqueestoutendoéqueeunãopossofazeroáudiosincronizarcomovídeocorretamente.Eutenteialgunscomandosffmpeg,cadaingênuoemumníveldiferente,enamelhordashipóteseséqueeureceboumfluxosincronizadonaáreadetrabalho,masnocelular(ondeareproduçãoétratadapeloplayernativododispositivo),ovídeoperdeasincroniacomoáudiomuitorapidamenteassimqueeualternoparaaoutrafaixadevídeo.

Estouusandooffmpeg3.1.1.

Umexemplodecomandoquetentei,começandodeumrelativamentesimples,ondemapeioasfaixasdeáudioparaosegmentermuxereovídeoparaohls:

ffmpeg-idual.mp4-iaudio_left.mp3-iaudio_right.mp3\-threads0-muxdelay0-y\-map0-pix_fmtyuv420p-vsync1-async1-vcodeclibx264-r29.97-g60-refs3-fhls-hls_time10-hls_list_size0video/index.m3u8\-map1-acodecaac-strictexperimental-async1-ar44100-ab96k-fsegment-segment_time10-segment_list_size0-segment_list_flags-cache-segment_formataac-segment_listaudio1/audio1.m3u8audio1/audio1%d.aac\-map2-acodecaac-strictexperimental-async1-ar44100-ab96k-fsegment-segment_time10-segment_list_size0-segment_list_flags-cache-segment_formataac-segment_listaudio2/audio2.m3u8audio2/audio2%d.aac

Paramaiscomplexo,comogerarocontêinermpegtsbrutoedividirasfaixas:

ffmpeg-idual_short.mp4-iaudio_left_short.mp3-iaudio_right_short.mp3\-threads0-muxdelay0-y\-map0:v-map1-map2-codeccopy-pix_fmtyuv420p-vsync1-async1-shortest-fmpegtspipe:1|ffmpeg-3.1.1-ipipe:0\-map0:0-vcodeccopy-r29.97-g60-refs3-bsf:vh264_mp4toannexb-fhls-hls_time10-hls_list_size0video/index.m3u8\-map0:1-fssegment-segment_time10-segment_list_size0-segment_formataac-segment_listaudio1/audio1.m3u8audio1/audio1_%d.aac\-map0:2-fssegment-segment_time10-segment_list_size0-segment_formataac-segment_listaudio2/audio2.m3u8audio2/audio2_%d.aac

Nãosouespecialistaemáudio/vídeo,entãotenhocertezadequeháalgofundamentalmenteerradoemmeuraciocínio,porissopeçoajudaeorientaçãoavocês.Emparticular:

  • Oqueestoutentandofazeraquiéinviável?OutramaneiradecolocarissoédadoNfaixasdeáudio,gravadasemsincroniacomovídeooriginal,paraproduzirumalistadereproduçãoHLScomoáudiosemprelip-synced?
  • OvídeoFPS&AstaxasdebitsdoáudiocausamoproblemadesincroniaA/V?Existemesmoumacorrelação?
  • Oníveldiferentedequalidadedovídeo(porexemplo,taxadebits)afetaasincronização?
  • Ocontêinerdeáudiodedestinoqueeuescolhi(mp3vsaac)influenciaasincronização?
  • Devousarumúnicocomandocomváriasentradasoutrabalharemcadafluxoseparadamente?

Comovocêpodever,estoubastanteperdido.Eupesquiseiextensivamentepelainternet,assistiapalestradaApplesobre"Effective HLS" da WWDC 2012, mas as informações sobre como produzir listas de reprodução eficazes de Múltiplos Rendições de Áudio parece ser escasso na internet.

Obrigado por qualquer indicação.

    
por Alfredo Di Napoli 11.07.2016 / 13:45

1 resposta

4

Eu mesmo encontrei a solução.

O problema é que o segment muxer precisa observar alguns quadros de referência para poder dividir o áudio corretamente, portanto, mapear os fluxos separadamente não funcionará.

O que vai funcionar é produzir um segmento ".tudo" que inclua todos os arquivos de áudio e vídeo, e então dividi-los apropriadamente. Um exemplo simples de trabalho:

ffmpeg-3.1.1 -i dual_short.mp4 -i audio_left_short.mp3 -i audio_right_short.mp3 \
    -threads 0 -muxdelay 0 -y \
    -map 0:v -map 1 -map 2 -pix_fmt yuv420p -movflags +faststart -r 29.97 -g 60 -refs 1 \
    -vcodec libx264 -acodec aac -profile:v baseline -level 30 -ar 44100 -ab 64k -f mpegts out.ts

# Perform 3 passes:
# 1. Generate the video.
ffmpeg-3.1.1 -i out.ts -threads 0 -muxdelay 0 -y -map 0:v   -vcodec copy  -f hls -hls_time 10 -hls_list_size 0 video/index.m3u8
# Generate Audio 1
ffmpeg-3.1.1 -i out.ts -threads 0 -muxdelay 0 -y -map 0:a:0 -codec copy -f segment -segment_time 10 -segment_list_size 0 -segment_list audio1/audio1.m3u8 -segment_format mpegts audio1/audio1_%d.aac
# Generate Audio 1
ffmpeg-3.1.1 -i out.ts -threads 0 -muxdelay 0 -y -map 0:a:1 -codec copy -f segment -segment_time 10 -segment_list_size 0 -segment_list audio2/audio2.m3u8 -segment_format mpegts audio2/audio2_%d.aac
    
por 27.07.2016 / 16:42