Eu tenho um dispositivo de gravação que produz arquivos "quase mono" - onde as faixas de áudio esquerda e direita diferem em quantidades insignificantes.
Esta resposta me diz como extrair o canal esquerdo.
ffmpeg -i in.flac -af 'pan=mono|c0=c0' out.flac
Esta resposta mostra o quanto os canais diferem:
ffmpeg -i in.flac -filter_complex "stereotools=phasel=1[tmp];[tmp]pan=1c|c0=0.5*c0+0.5*c1,volumedetect" -f null /dev/null
Exemplo de saída:
[Parsed_volumedetect_2 @ 0x7fc11920d500] n_samples: 125219672
[Parsed_volumedetect_2 @ 0x7fc11920d500] mean_volume: -91.0 dB
[Parsed_volumedetect_2 @ 0x7fc11920d500] max_volume: -50.8 dB
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_50db: 1
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_51db: 0
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_52db: 0
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_53db: 0
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_54db: 0
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_55db: 0
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_56db: 1
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_57db: 0
...
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_89db: 0
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_90db: 0
[Parsed_volumedetect_2 @ 0x7fc11920d500] histogram_91db: 125219661
(Um pouco prolixo, mas mostra bem que a diferença máxima é bastante silenciosa e quase todas as amostras são idênticas.)
Não me sinto confortável em alterar os comandos do filtro. Existe uma maneira de converter para mono e verificar o "mono" sem ler o arquivo duas vezes?
Aqui está o comando combinado.
ffmpeg -i in.flac -filter_complex "asplit=2[mono][diff];[diff]stereotools=phasel=1,pan=1c|c0=0.5*c0+0.5*c1,volumedetect,anullsink;[mono]pan=mono|c0=c0" out.flac