iMovie (nie bezstratny, ale lepszy niż wcześniej)
iMovie v10 (wydany jakiś czas po pierwotnym zadaniu pytania) teraz lepiej obsługuje więcej typów multimediów, dzięki czemu unika się ponownego kodowania importu dla większości treści H.264 (mp4, m4v, mov, AVHDC, mts, mt2s).
Jednak nadal będzie ponownie kodowany podczas eksportu, więc nie może być technicznie bezstratny - kolejną nową funkcją jest jednak możliwość dostosowania jakości eksportu, która może być bardziej zbliżona do bezstratnej. Podejrzewam, że ta część odpowiedzi może mieć zastosowanie w równym stopniu do innych programów do edycji wideo „sterowanych projektami” (np. Premiere lub Final Cut), ponieważ myślę, że ogólnie wszystkie ponownie kodują na wyjściu, chociaż zwykle są bardzo łatwe w użyciu do precyzyjnego przycinania.
Osobiście uważam, że pojedyncze ponowne kodowanie nie jest wielkim problemem, ale rozumiem, że konkretnie poprosiłeś o bezstratne rozwiązanie, więc ...
Bezstratny (ale o wiele bardziej skomplikowany!)
Istnieją techniczne ograniczenia dotyczące tego, jak dokładnie można wyciąć wideo bez konieczności ponownego kodowania co najmniej jego części, i zasadniczo zależy to od częstotliwości i-klatki. Jeśli każda ramka jest ramką i, możesz wycinać w dowolnym miejscu, ale jeśli są one co kilka sekund, możesz wycinać tylko bezstratnie w tych ramkach i bez utraty zawartości lub konieczności ponownego kodowania (przynajmniej części stream), aby można było rozpocząć od i-ramki.
ffmpeg
W niniejszych pytaniach i odpowiedziach w szczególności powstaje pytanie, jak korzystać z i-ramek ffmpeg
. Nie znam żadnych aplikacji GUI, aby to zrobić, ale w zasadzie uruchamiasz komendę podobną do następującej:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
Podane dwa razy to start i czas trwania , i mogą być określone albo w sekundach, albo hh:mm:ss.ss
, -acodec copy
i -vcodec copy
informują ffmpeg, aby nie kodował ponownie.
Nie jestem do końca pewien, co się stanie, jeśli zrobisz zbyt wcześnie, ale myślę, że wideo jest zasadniczo puste (lub może być uszkodzone, w zależności od odtwarzacza), dopóki nie napotka i-klatki. Prawdopodobnie będziesz chciał znaleźć najbliższą i-ramkę przed cięciem. Ta odpowiedź rozwiązuje ten problem przy użyciu ffprobe
i awk
, choć trochę niezręcznie. Zasadniczo używasz ffprobe
do skanowania ramek i znajdowania najbliższej klatki kluczowej ( flags=K
) przed idealnym punktem odcięcia. Pełny wynik dla każdej klatki wideo można zobaczyć w następujący sposób:
ffprobe -select_streams v -show_frames <INPUT>
Połączona odpowiedź dostarcza tego polecenia, aby znaleźć klatkę kluczową przed określonym czasem:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 |
awk -F= '
/pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }
' | head -n 1
I na koniec, jeśli naprawdę musisz wyciąć gdzieś pomiędzy dwie i-klatki, możesz podzielić wideo i ponownie dołączyć. W oparciu o informacje z tej odpowiedzi powinno to być coś takiego:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Gdzie list_of_videos.txt
jest prosty plik tekstowy z listą plików, które chcesz połączyć.
streszczenie
iMovie jest prawdopodobnie wystarczająco dobry dla większości przypadków (od wersji 10) i bardzo łatwy.
ffmpeg może to robić bezstratnie (lub bardzo blisko bezstratnie), z odrobiną zabawy; poziom trudności zależy od tego, jak jesteś wybredny w kwestii dokładnego punktu początkowego i częstotliwości i-ramek.