Nota: Postei a mesma pergunta no stackoverflow pouco tempo antes, quando ainda não encontrei essa comunidade. Reposto isso, já que a pergunta é mais adequada para esta comunidade.
1. O que eu tentei
Tenho alguns arquivos .MTS (formato AVCHD) gravados com minha câmera AVCHD . Sua especificação é como mostrado abaixo:
$ ffprobe 140612_Canon-00000.MTS
ffprobe version 2.2.1 Copyright (c) 2007-2014 the FFmpeg developers
(snip)
Input #0, mpegts, from '140612_Canon-00000.MTS':
Duration: 00:48:58.40, start: 0.800300, bitrate: 5563 kb/s
Program 1
Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448),
yuv420p, 1440x1080 [SAR 4:3 DAR 16:9],
29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz,
stereo, fltp, 256 kb/s
Preste atenção à parte da taxa de quadros / base de tempo: 29,97 fps, 29,97 tbr, 90k tbn, 59,94 tbc
Agora, eu gostaria de converter esse arquivo em arquivo .mp4, sem recodificar o fluxo de vídeo H264 , por outro lado, com a transcodificação do fluxo de áudio em AAC . Então, eu tentei o seguinte comando:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. Resultado
e a especificação do arquivo de saída é mostrada abaixo:
$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.33.100
Duration: 00:01:00.04, start: 0.021333, bitrate: 4590 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s,
59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D),
48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Veja a parte da taxa de quadros / base de tempo: 59,94 fps, 59,94 tbr, 90k tbn, 59,94 tbc . Embora o ffmpeg tenha copiado o fluxo de vídeo, a taxa de quadros e a base de tempo foram alteradas para o valor duas vezes .
Portanto, quando abro e reproduzo o arquivo de saída com o QuickTime Player ou VLC Player, o áudio não tem problema; no entanto, o fluxo de vídeo não é reproduzido corretamente. O vídeo é reproduzido com o quadro para frente e para trás tremendo repetidamente.
3. Pergunta
- Como posso converter o arquivo .MTS (AVCHD) para .mp4 pelo ffmpeg sem recodificar o fluxo de vídeo H264 corretamente ?
- Como posso manter os valores originais da taxa de quadros / base de tempo (fps / tbr / tbn / tbc) ao converter o contêiner com
ffmpeg
e seu-vcodec copy
comutador. - Como definir valores de framerate / timebase (fps / tbr / tbn / tbc) pelas opções de linha de comando do ffmpeg sem recodificar um fluxo de vídeo.
Alguma ideia?
4. Adicionando -r 29.97
opção
O professor Sparkles me deu um conselho a acrescentar -r 29.97
. Eu tentei isso:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
No entanto, o arquivo de saída ainda possui taxa de quadros / timebase incorretas:
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s,
59.94 fps, 59.94 tbr, 11988 tbn, 59.94 tbc (default)
5. Remux usando MP4Box
Eu tentei desmembrar e remux usando o MP4Box, de acordo com o conselho do professor Sparkles.
brew install mp4box
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
-vcodec copy -an 140612_Canon-00000.MTS.h264
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
-vn -acodec libfaac -ab 128k 140612_Canon-00000.MTS.aac
mp4box -add 140612_Canon-00000.MTS.h264:fps=29.97 \
-add 140612_Canon-00000.MTS.aac \
-new 140612_Canon-00000.MTS.mp4
e a saída foi:
$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
(snip)
Duration: 00:02:00.22, start: 0.000000, bitrate: 2293 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661),
yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 2228 kb/s,
29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
creation_time : 2014-07-14 00:38:23
handler_name : 140612_Canon-00000.MTS.h264:fps=29.97
- Imported with GPAC 0.5.0-rev4065
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz,
stereo, fltp, 125 kb/s (default)
Parece um pequeno passo à frente. Veja a parte da taxa de quadros / base de tempo: 29,97 fps, 29,97 tbr, 30k tbn, 59,94 tbc . Esses são correspondentes ao fluxo original, exceto portbn
(valor da base de tempo do contêiner).
No entanto, quando reproduzo o arquivo de saída com o Quicktime Player ou VLC, o vídeo é reproduzido na metade da velocidade .
Embora o arquivo original tenha 90k tbn
(90000 ticks por segundo) e o novo arquivo de saída da MP4Box possua 30k tbn
apenas um terço do valor do original, o arquivo de saída é reproduzido na metade da velocidade.
Não sei o motivo. Mas acho que o resto é como posso ajustar o tbn
valor.
5-b. Relatório do MediaInfo no arquivo de saída
Eu também tentei a ferramenta MediaInfo no arquivo de saída gerado pelo 5. Remux usando o MP4Box . A saída está aqui: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Tentando avconv
Volodya relatou que avconv
funcionou bem. Também preparei um pequeno arquivo de filme de amostra (Canon-00006.MTS) gravado com a mesma câmera. Ok, vamos tentar:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
As informações ffprobe do arquivo de saída estão aqui: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 e suas informações de taxa de quadros / base de tempo são as seguintes: 59,94 fps, 59,94 tbr, 90k tbn, 59,94 tbc
O arquivo de saída foi reproduzido bem com o VLC Player, como Volodya relatou. No entanto, ao abri-lo com o Quicktime Player X, o vídeo foi reproduzido na velocidade normal, mas com o quadro para trás tremendo repetidamente.
7. Por que o aplicativo "Free AVCHD to MOV" funciona?
Como mencionei no meu comentário anterior , o recurso "rewrap to MOV" do aplicativo Free AVCHD to MOV funcionou bem, mesmo que não faça MP4, mas MOV.
O software chama seu próprio programa ffmpeg (ou avconv) internamente, e vi quais opções são passadas para ele. É como mostrado abaixo:
/Applications/Free AVCHD to Mov.app/Contents/Resources/bin/com.geranium-soft.convert \
-i /path/to/140710_Canon-00003.MTS \
-map 0:0 -map 0:1 -c:a libfaac -vol 256 -b:a 128k -c:v copy \
-sn -movflags faststart -threads 0 -pix_fmt yuv420p -y \
/path/to/140710_Canon-00003.mov
Eu tentei passar as mesmas opções (Exatamente o mesmo. Defino o tipo de contêiner de saída como MOV e removi o -t 60
interruptor uniforme .) Para o programa ffmpeg e a conversão. Mas o resultado foi o mesmo relatado até agora .
De qualquer forma, esse ótimo aplicativo resolveu meu problema em "Como posso converter o arquivo .MTS (AVCHD) para .mp4 sem recodificar o fluxo de vídeo H264?", Exceto em "para .mp4" e "por ffmpeg". Mas ainda estou interessado em saber por que esse aplicativo funciona bem, mas o ffmpeg não.