Uwaga: zadałem to samo pytanie do stackoverflow krótko przedtem, kiedy jeszcze nie znalazłem tej społeczności. Przekazuję to ponownie, ponieważ pytanie jest bardziej odpowiednie dla tej społeczności.
1. Co próbowałem
Mam niektóre pliki .MTS (format AVCHD) zapisane w mojej kamerze AVCHD . Jego specyfikacja jest pokazana poniżej:
$ 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
Zwróć uwagę na część framerate / timebase: 29,97 fps, 29,97 tbr, 90k tbn, 59,94 tbc
Teraz chciałbym przekonwertować ten plik na plik .mp4, bez przekodowywania strumienia wideo H264 , z drugiej strony, z transkodowaniem jego strumienia audio do AAC . Więc spróbowałem następującego polecenia:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. Wynik
a specyfikacja pliku wyjściowego jest następująca:
$ 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
Spójrz na część framerate / timebase: 59,94 fps, 59,94 tbr, 90k tbn, 59,94 tbc . Chociaż ffmpeg właśnie skopiował strumień wideo, liczba klatek na sekundę i podstawa czasu zostały zmienione na dwukrotną wartość .
Kiedy więc otwieram i odtwarzam plik wyjściowy za pomocą QuickTime Player lub VLC Player, dźwięk nie ma problemu, jednak strumień wideo nie jest odtwarzany poprawnie. Wideo jest odtwarzane z kilkukrotnym drżeniem do przodu i do tyłu.
3. Pytanie
- Jak mogę przekonwertować plik .MTS (AVCHD) do .mp4 przez ffmpeg bez ponownego kodowania strumienia wideo H264 ?
- Jak mogę zachować oryginalne wartości klatek / podstawy czasu (fps / tbr / tbn / tbc), kiedy przekonwertuję kontener za pomocą
ffmpeg
i jego-vcodec copy
przełącznika. - Jak ustawić wartości framerate / timebase (fps / tbr / tbn / tbc) za pomocą opcji wiersza poleceń ffmpeg bez ponownego kodowania strumienia wideo.
Jakieś pomysły?
4. Dodanie -r 29.97
opcji
Profesor Sparkles dał mi radę do dodania -r 29.97
. Próbowałem:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
Jednak plik wyjściowy nadal ma nieprawidłową liczbę klatek na sekundę / podstawę czasu:
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 za pomocą MP4Box
Próbowałem demux i remux przy użyciu MP4Box, zgodnie z radą profesora Sparklesa.
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
i wynik był:
$ 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)
To wygląda na krok do przodu. Spójrz na część framerate / timebase: 29,97 fps, 29,97 tbr, 30k tbn, 59,94 tbc . Są one zgodne z oryginalnym strumieniem, z wyjątkiemtbn
(wartości podstawy czasu z kontenera).
Jednak gdy odtwarzam plik wyjściowy za pomocą Quicktime Player lub VLC, wideo jest odtwarzane z połową prędkości .
Chociaż oryginalny plik ma 90k tbn
(90000 tyknięć na sekundę), a nowy plik wyjściowy z MP4Box ma 30k tbn
zaledwie jedną trzecią wartości oryginalnego pliku, plik wyjściowy jest odtwarzany z połową prędkości.
Nie wiem dlaczego. Ale myślę, że resztą jest sposób, w jaki mogę dostosować tbn
wartość.
5-b. Raport MediaInfo na temat pliku wyjściowego
Próbowałem także narzędzia MediaInfo na pliku wyjściowym wygenerowanym przez 5. Remux przy użyciu MP4Box . Dane wyjściowe są tutaj: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Próbowanie avconv
Zgłoszona Wołodia avconv
działała dobrze. Przygotowałem także krótki przykładowy plik filmowy (Canon-00006.MTS) nagrany tym samym aparatem. OK, spróbujmy:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
Informacje o pliku ffprobe pliku wyjściowego znajdują się tutaj: https://gist.github.com/kaorukobo/5b53244ade2632ff1211, a jego informacje o liczbie klatek na sekundę / podstawie czasu są następujące: 59,94 fps, 59,94 tbr, 90k tbn, 59,94 tbc
Plik wyjściowy był dobrze odtwarzany w VLC Player, jak donosi Volodya. Jednak otwierając go za pomocą Quicktime Player X, wideo było odtwarzane z normalną prędkością, ale z kilkakrotnie drżącą klatką do tyłu.
7. Dlaczego działa aplikacja „Free AVCHD to MOV”?
Jak wspomniałem w poprzednim komentarzu , funkcja „przewiń do MOV” w aplikacji AVCHD do MOV działała dobrze, mimo że nie tworzy MP4, tylko MOV.
Oprogramowanie wywołuje wewnętrznie własny program ffmpeg (lub avconv) i widziałem, jakie opcje są do niego przekazywane. Jest jak pokazano poniżej:
/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
Próbowałem przekazać te same opcje (Ekstrakcyjnie takie same. Ustawiłem typ pojemnika wyjściowego na MOV i usunąłem nawet -t 60
przełącznik.) Do programu ffmpeg i dokonałem konwersji. Ale wynik był taki sam jak dotychczas .
W każdym razie ta świetna aplikacja rozwiązała mój problem z „Jak przekonwertować plik .MTS (AVCHD) na .mp4 bez ponownego kodowania strumienia wideo H264?”, Z wyjątkiem „do .mp4” i „przez ffmpeg”. Ale nadal interesuje mnie, dlaczego ta aplikacja ma się dobrze, ale ffmpeg nie.