Nota: ho pubblicato la stessa domanda su StackOverflow poco tempo prima, quando non ho ancora trovato questa comunità. Ripubblico perché la domanda è più adatta a questa comunità.
1. Cosa ho provato
Ho alcuni file .MTS (formato AVCHD) registrati con la mia videocamera AVCHD . Le sue specifiche sono le seguenti:
$ 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
Prestare attenzione alla parte del framerate / base dei tempi: 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Ora vorrei convertire questo file in file .mp4, senza ricodificare il flusso video H264 , d'altra parte, con la transcodifica del suo flusso audio in AAC . Quindi ho provato il seguente comando:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. Risultato
e le specifiche del file di output sono le seguenti:
$ 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
Guarda la parte del framerate / base dei tempi: 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc . Sebbene ffmpeg abbia appena copiato il flusso video, framerate e timebase sono stati cambiati in due volte il valore .
Pertanto, quando apro e riproduco il file di output con QuickTime Player o VLC Player, l'audio non presenta alcun problema, tuttavia il flusso video non viene riprodotto correttamente. Il video viene riprodotto con la cornice in avanti e all'indietro più volte tremante.
3. Domanda
- Come posso convertire il file .MTS (AVCHD) in .mp4 di ffmpeg senza ricodificare correttamente il flusso video H264 ?
- Come posso mantenere i valori di framerate / timebase originali (fps / tbr / tbn / tbc) quando converto il contenitore con
ffmpeg
e il suo-vcodec copy
switch. - Come posso impostare i valori di framerate / base dei tempi (fps / tbr / tbn / tbc) dalle opzioni della riga di comando di ffmpeg senza ricodificare un flusso video.
Qualche idea?
4. Aggiunta -r 29.97
dell'opzione
Il professor Sparkles mi ha dato un consiglio da aggiungere -r 29.97
. Ho provato che:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
Tuttavia, il file di output ha ancora framerate / timebase errati:
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
Ho provato demux e remux usando MP4Box, secondo i consigli del 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 l'output era:
$ 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)
Sembra un po 'avanti. Guarda la parte del framerate / base dei tempi: 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc . Questi corrispondono al flusso originale, ad eccezione ditbn
(valore della base dei tempi dal contenitore).
Tuttavia, quando riproduco il file di output con Quicktime Player o VLC, il video viene riprodotto a metà velocità .
Sebbene il file originale abbia 90k tbn
(90000 tick al secondo) e il nuovo file di output da MP4Box abbia 30k tbn
un valore di appena un terzo di quello originale, il file di output viene riprodotto a metà velocità.
Non conosco il motivo per cui. Ma penso che il resto sia come posso aggiustare il tbn
valore.
5-b. Rapporto di MediaInfo sul file di output
Ho anche provato lo strumento MediaInfo sul file di output generato da 5. Remux usando MP4Box . L'output è qui: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Provare avconv
Volodya ha avconv
funzionato bene. Inoltre ho preparato un breve filmato di esempio (Canon-00006.MTS) registrato con la stessa fotocamera. Ok, proviamo:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
Le informazioni su ffprobe del file di output sono qui: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 e le sue informazioni su framerate / timebase sono le seguenti: 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc
Il file di output è stato riprodotto bene con VLC Player come riportato da Volodya. Tuttavia, aprendolo con Quicktime Player X, il video è stato riprodotto alla velocità normale ma con il suo fotogramma all'indietro ripetutamente ripetutamente.
7. Perché l'app "Free AVCHD to MOV" funziona?
Come ho già detto nel mio commento precedente , la funzione "rewrap to MOV" dell'app Free AVCHD to MOV ha funzionato bene, anche se non produce MP4 ma MOV.
Il software chiama internamente il proprio programma ffmpeg (o avconv) e ho visto quali opzioni gli sono state passate. È come mostrato di seguito:
/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
Ho provato a passare le stesse opzioni (Estremamente uguale. Ho impostato il tipo di contenitore di output su MOV e ho rimosso anche l' -t 60
interruttore.) Al programma ffmpeg e alla conversione. Ma il risultato è stato lo stesso riportato finora .
Comunque quella grande app ha risolto il mio problema su "Come posso convertire il file .MTS (AVCHD) in .mp4 senza ricodificare il flusso video H264?", Tranne "in .mp4" e "by ffmpeg". Ma sono ancora interessato al perché quell'app funziona bene, ma ffmpeg no.