Remarque: j'ai posté la même question à stackoverflow peu de temps auparavant, alors que je n'ai pas encore trouvé cette communauté. Je republie cela car la question est plus adaptée à cette communauté.
1. Ce que j'ai essayé
J'ai des fichiers .MTS (format AVCHD) enregistrés avec mon appareil photo AVCHD . Sa spécification est comme indiqué ci-dessous:
$ 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
Faites attention à la partie de la fréquence d'images / base de temps: 29,97 ips, 29,97 tbr, 90k tbn, 59,94 tbc
Maintenant, je voudrais convertir ce fichier en fichier .mp4, sans ré-encoder le flux vidéo H264 , d'autre part, avec transcoder son flux audio en AAC . J'ai donc essayé la commande suivante:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. Résultat
et les spécifications du fichier de sortie sont les suivantes:
$ 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
Regardez la partie de la fréquence d'images / base de temps: 59,94 ips, 59,94 tbr, 90k tbn, 59,94 tbc . Bien que ffmpeg ait simplement copié le flux vidéo, la fréquence d'images et la base de temps ont été modifiées en deux fois .
Ainsi, lorsque j'ouvre et lit le fichier de sortie avec QuickTime Player ou VLC Player, l'audio n'a aucun problème, cependant, le flux vidéo n'est pas lu correctement. La vidéo est lue avec son image en avant et en arrière de façon répétée.
3. Question
- Comment puis-je convertir un fichier .MTS (AVCHD) en .mp4 par ffmpeg sans ré-encoder correctement le flux vidéo H264 ?
- Comment puis-je conserver les valeurs d'origine de la fréquence d'images / base de temps (fps / tbr / tbn / tbc) lorsque je convertis le conteneur avec
ffmpeg
et son-vcodec copy
commutateur. - Comment puis-je définir des valeurs de framerate / base de temps (fps / tbr / tbn / tbc) par les options de ligne de commande de ffmpeg sans ré-encoder un flux vidéo.
Des idées?
4. Ajout d'une -r 29.97
option
Le professeur Sparkles m'a donné un conseil à ajouter -r 29.97
. J'ai essayé ça:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
Cependant, le fichier de sortie a toujours une mauvaise fréquence d'images / base de temps:
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 en utilisant MP4Box
J'ai essayé le demux et le remux en utilisant MP4Box, selon les conseils du professeur 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
et la sortie était:
$ 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)
Cela semble un peu plus avancé. Regardez la partie de la fréquence d'images / base de temps: 29,97 ips, 29,97 tbr, 30k tbn, 59,94 tbc . Celles-ci correspondent au flux d'origine, à l' exception detbn
(valeur de la base de temps du conteneur).
Cependant, lorsque je lis le fichier de sortie avec Quicktime Player ou VLC, la vidéo est lue à mi-vitesse .
Bien que le fichier d'origine ait 90k tbn
(90000 ticks par seconde) et que le nouveau fichier de sortie de MP4Box ait 30k tbn
seulement un tiers de la valeur d'origine, le fichier de sortie est lu à mi-vitesse.
Je ne sais pas pourquoi. Mais je pense que le reste est de savoir comment je peux ajuster la tbn
valeur.
5-b. Rapport de MediaInfo sur le fichier de sortie
J'ai également essayé l' outil MediaInfo sur le fichier de sortie généré par 5. Remux en utilisant MP4Box . La sortie est ici: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Essayer avconv
Volodya a indiqué qu'il avconv
fonctionnait bien. J'ai également préparé un court exemple de fichier vidéo (Canon-00006.MTS) enregistré avec le même appareil photo. D'accord, essayons:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
Les informations ffprobe du fichier de sortie sont ici: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 et ses informations de fréquence d'images / base de temps sont les suivantes: 59,94 ips, 59,94 tbr, 90k tbn, 59,94 tbc
Le fichier de sortie a été bien lu avec VLC Player comme l'a rapporté Volodya. Cependant, en l'ouvrant avec Quicktime Player X, la vidéo a été lue à la vitesse normale mais avec son image en arrière de façon répétée et tremblante.
7. Pourquoi l'application "Free AVCHD to MOV" fonctionne-t-elle?
Comme je l'ai mentionné dans mon commentaire précédent , la fonction de «reconditionnement vers MOV» de l' application Free AVCHD to MOV a bien fonctionné, même si elle ne fait pas MP4 mais MOV.
Le logiciel appelle son propre programme ffmpeg (ou avconv) en interne, et j'ai vu quelles options lui sont transmises. C'est comme indiqué ci-dessous:
/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
J'ai essayé de passer les mêmes options (Extrêmement identiques. J'ai défini le type de conteneur de sortie sur MOV et supprimé même le -t 60
commutateur.) Au programme ffmpeg et à la conversion. Mais le résultat était le même que celui rapporté jusqu'à présent .
Quoi qu'il en soit, cette excellente application a résolu mon problème sur "Comment puis-je convertir un fichier .MTS (AVCHD) en .mp4 sans réencoder le flux vidéo H264?", Sauf dans "en .mp4" et "par ffmpeg". Mais je suis toujours curieux de savoir pourquoi cette application fonctionne bien, mais pas ffmpeg.