Eu tenho um cenário de teste onde tenho um arquivo M2TS (chamado 1.m2ts
) que contém uma trilha de vídeo e várias trilhas de áudio. Uma das faixas de áudio é incomum por estar em bluray_pcm
formato.
Na primeira etapa, gostaria de criar um novo arquivo M2TS (chamado 2.m2ts
) 1.m2ts
que contenha todas as trilhas de áudio, exceto a bluray_pcm
trilha removida.
Na segunda etapa, gostaria de converter 2.m2ts
para o formato MKV (arquivo 3.mkv
).
Como o MKV parece incapaz de lidar com uma bluray_pcm
faixa, também converto a bluray_pcm
faixa em áudio PCM normal durante a primeira etapa.
A primeira etapa funciona em princípio, mas o ffmpeg bagunça as tags do codec. Depois de perceber isso, pesquisei o assunto e descobri que deveria adicionar -map_metadata
na linha de comando, mas infelizmente não adiantou. A seguir são mostradas as linhas de comando e as alterações nas tags do codec:
Primeiro, deixei o ffprobe gerar os dados da trilha do arquivo original 1.m2ts
:
ffprobe -print_format json -loglevel fatal -show_streams -count_frames -i 1.m2ts > 1.json
1.json
então tinha o seguinte conteúdo (deixando de lado linhas irrelevantes):
{
"streams": [
{
"index": 0,
"codec_name": "mpeg2video",
"codec_long_name": "MPEG-2 video",
"profile": "Main",
"codec_type": "video",
"codec_tag_string": "HDMV",
"codec_tag": "0x564d4448",
},
{
"index": 1,
"codec_name": "ac3",
"codec_long_name": "ATSC A/52A (AC-3)",
"codec_type": "audio",
"codec_tag_string": "AC-3",
"codec_tag": "0x332d4341",
"sample_fmt": "fltp",
},
{
"index": 2,
"codec_name": "ac3",
"codec_long_name": "ATSC A/52A (AC-3)",
"codec_type": "audio",
"codec_tag_string": "AC-3",
"codec_tag": "0x332d4341",
"sample_fmt": "fltp",
},
{
"index": 3,
"codec_name": "pcm_bluray",
"codec_long_name": "PCM signed 16|20|24-bit big-endian for Blu-ray media",
"codec_type": "audio",
"codec_tag_string": "HDMV",
"codec_tag": "0x564d4448",
"sample_fmt": "s16",
},
]
}
Até agora tudo bem. Como podemos ver, a bluray_pcm
faixa é a faixa 3.
Então criei 2.m2ts
conforme descrito acima:
ffmpeg -analyzeduration 100G -probesize 100G -fix_sub_duration -copyts -i 1.m2ts -map 0:0 -map 0:3 -map_metadata 0 -muxpreload 0 -muxdelay 0 -vcodec copy -acodec pcm_s16le 2.m2ts
Observe que a linha de comando contém -map_metadata 0
.
O comando foi executado sem erros, então chegou a hora de analisar 2.m2ts
pelo método mostrado acima:
ffprobe -print_format json -loglevel fatal -show_streams -count_frames -i 2.m2ts > 2.json
2.json
então contido (novamente, deixando de lado partes irrelevantes):
{
"streams": [
{
"index": 0,
"codec_name": "mpeg2video",
"codec_long_name": "MPEG-2 video",
"profile": "Main",
"codec_type": "video",
"codec_tag_string": "[2][0][0][0]",
"codec_tag": "0x0002",
},
{
"index": 1,
"codec_name": "bin_data",
"codec_long_name": "binary data",
"codec_type": "data",
"codec_tag_string": "[6][0][0][0]",
"codec_tag": "0x0006",
}
]
}
Portanto o codec de áudio agora é "bin_data". E além disso, o codec_tag_string
e o codec_tag
da trilha de vídeo também estão confusos.
Consequentemente, ao tentar converter 2.m2ts
para 3.mkv
, acontece o seguinte (novamente, linhas irrelevantes deixadas de lado):
ffmpeg.exe" -i 2.m2ts -map 0:0 -map 0:1 -codec copy 3.mkv
Input #0, mpegts, from '2.m2ts':
Duration: 01:46:24.34, start: 11.650667, bitrate: 22115 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x1011]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 90k tbn
Side data:
cpb: bitrate max/min/avg: 30000000/0/0 buffer size: 9781248 vbv_delay: N/A
Stream #0:1[0x1100]: Data: bin_data ([6][0][0][0] / 0x0006)
File '3.mkv' already exists. Overwrite? [y/N] y
[matroska @ 000001f6cfd4d340] Tag [6][0][0][0] incompatible with output codec id '98314' ([0][0][0][0])
[out#0/matroska @ 000001f6cfd25dc0] Could not write header (incorrect codec parameters ?): Invalid data found when processing input
Error opening output file 3.mkv.
Error opening output files: Invalid data found when processing input
Agora gostaria de saber onde está meu erro. O procedimento que utilizo na etapa 1 (remover todas as trilhas de áudio, exceto bluray_pcm track
e converter essa trilha em PCM normal) é descrito em vários tutoriais e perguntas e respostas, respectivamente.
Por que isso bagunça os metadados da trilha de vídeo também está além do meu horizonte (embora isso não tenha efeitos colaterais negativos, aparentemente).
O que exatamente preciso fazer para converter uma bluray_pcm
faixa em um arquivo M2TS em PCM normal, para que o arquivo M2TS resultante possa ser processado posteriormente e como evito que o ffmpeg altere as tags do codec?
Como o @Rotem apontou no comentário, o LPCM não é suportado diretamente no MPEG-TS. No entanto, você pode empacotá-lo como um fluxo SMPTE ST 302 usando
-acodec s302m -strict -2
.