W społeczności Open Source lub aktywnej społeczności programistów często istnieje potrzeba publikowania dużych segmentów wideo w Internecie. (Filmy wideo o spotkaniach, obozy, rozmowy techniczne ...) Ponieważ jestem programistą, a nie filmowcem, nie chcę rozwiązywać dodatkowych problemów na koncie premium Vimeo. Jak w takim razie wziąć wideo instruktażowe MPEG o pojemności 12,5 GB (1:20:00) i pokroić je na segmenty 00:10:00 w celu łatwego przesłania do witryn udostępniania wideo?
ffmpeg
video-editing
Gabriel
źródło
źródło
Odpowiedzi:
Zawinięcie tego w skrypt, aby zrobić to w pętli, nie byłoby trudne.
Uwaga: jeśli spróbujesz obliczyć liczbę iteracji na podstawie czasu trwania
ffprobe
połączenia, że jest to szacowane na podstawie średniej przepływności na początku klipu i rozmiaru pliku klipu, chyba że podasz-count_frames
argument, który znacznie spowalnia jego działanie .Kolejną rzeczą, o której należy pamiętać, jest to, że pozycja
-ss
opcji w wierszu poleceń ma znaczenie . To, co mam teraz, jest powolne, ale dokładne. Pierwsza wersja tej odpowiedzi dała szybką, ale niedokładną alternatywę. W linkowanym artykule opisano również najczęściej szybką, ale wciąż dokładną alternatywę, za którą płacisz z odrobiną złożoności.Poza tym, nie sądzę, że naprawdę chcesz wycinać dokładnie 10 minut dla każdego klipu. To spowoduje umieszczenie cięć w środku zdań, a nawet słów. Myślę, że powinieneś używać edytora wideo lub odtwarzacza, aby znaleźć naturalne punkty odcięcia w odstępie 10 minut.
Zakładając, że Twój plik ma format, który YouTube może bezpośrednio zaakceptować, nie musisz ponownie kodować, aby uzyskać segmenty. Po prostu przekaż naturalne przesunięcia punktu odcięcia do
ffmpeg
, mówiąc mu, aby przekazało zakodowane A / V przez nietknięte za pomocą kodeka „kopiuj”:-c copy
Argumentem informuje go skopiować wszystkie strumienie wejściowe (audio, wideo i potencjalnie innych, takich jak napisami) do wyjścia jak jest. W przypadku prostych programów A / V jest to odpowiednik bardziej szczegółowych flag-c:v copy -c:a copy
lub flag w starym stylu-vcodec copy -acodec copy
. Możesz użyć bardziej pełnego stylu, jeśli chcesz skopiować tylko jeden ze strumieni, ale ponownie zakodować drugi. Na przykład wiele lat temu powszechna była praktyka z plikami QuickTime do kompresji wideo za pomocą wideo H.264, ale pozostawienie dźwięku jako nieskompresowanego PCM ; jeśli dzisiaj natknąłeś się na taki plik, możesz go zmodernizować,-c:v copy -c:a aac
aby ponownie przetworzyć tylko strumień audio, pozostawiając nienaruszony film.Punktem początkowym każdego polecenia powyżej po pierwszym jest punkt początkowy poprzedniego polecenia plus czas trwania poprzedniego polecenia.
źródło
ffmpeg
muszą zachować synchronizację między strumieniami audio i wideo w pliku źródłowym. Jeśli tak się dzieje, istnieją bardziej skomplikowane metody podziału, które pozwalają uniknąć problemu.Oto jedno liniowe rozwiązanie :
Pamiętaj, że nie daje to dokładnych podziałów, ale powinno pasować do twoich potrzeb. Zamiast tego będzie ciąć w pierwszej klatce po upływie określonego czasu
segment_time
, w powyższym kodzie będzie to po znaku 20 minut.Jeśli stwierdzisz, że można odtwarzać tylko pierwszy fragment, spróbuj dodać,
-reset_timestamps 1
jak wspomniano w komentarzach.źródło
-reset_timestamps 1
poprawia dla mnie problemWcześniej napotkałem ten sam problem i stworzyliśmy prosty skrypt Pythona, aby to zrobić (używając FFMpeg). Dostępne tutaj: https://github.com/c0decracker/video-splitter i wklejone poniżej:
źródło
Jeśli chcesz stworzyć naprawdę takie same fragmenty, musisz zmusić ffmpeg do utworzenia ramki i na pierwszej ramce każdego fragmentu, abyś mógł użyć tego polecenia do utworzenia 0,5-sekundowego fragmentu.
źródło
Alternatywny bardziej czytelny sposób byłoby
Oto źródło i lista często używanych poleceń FFmpeg.
źródło
Zwróć uwagę, że dokładna interpunkcja alternatywnego formatu to
-ss mm:ss.xxx
. Walczyłem godzinami, próbując użyć intuicyjnego, ale błędnego,mm:ss:xx
bezskutecznie.Referencje tutaj i tutaj .
źródło
źródło
Po prostu użyj tego, co jest wbudowane w ffmpeg, aby zrobić dokładnie to.
To podzieli go na około 2-sekundowe uchwyty, podzieli na odpowiednie klatki kluczowe i wyśle do plików cam_out_h2640001.mp4, cam_out_h2640002.mp4 itd.
źródło