Chciałbym podzielić duży film avi na dwa kolejne mniejsze filmy. Używam ffmpeg.
Jednym ze sposobów jest dwukrotne uruchomienie ffmpeg:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Ale zgodnie ze stroną podręcznika ffmpeg, mogę utworzyć więcej niż jeden plik wyjściowy z jednego pliku wejściowego, używając tylko jednej linii:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
-vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Moje pytanie brzmi, czy późniejsze podejście oszczędza czas obliczeń i pamięć?
htop
) i nie powiesz nam, jaka jest odpowiedź?-ss
opcji wejściowej w drugim splicie może nie być dokładne, więc możesz nie uzyskać czystego podziału. IMO przykład OP jest bardziej poprawny.Odpowiedzi:
Wiki ffmpeg odsyłają do tej strony w odniesieniu do „Jak efektywnie podzielić wideo”. Nie jestem przekonany, że ta strona odpowiada na to pytanie, więc zrobiłem zgodnie z sugestią @AlcubierreDrive…
Które wyjścia ...
Przetestowałem plik SD i HD po kilku uruchomieniach i odrobinie matematyki.
Plik SD = 1,35 GB strumień transportowy DVB
Plik HD = 3,14 GB strumień transportowy DVB
Wniosek
Pojedyncze polecenie jest lepsze, jeśli obsługujesz HD, zgadza się z komentarzami podręczników na temat używania opcji -ss po pliku wejściowym w celu „powolnego wyszukiwania”. Pliki SD mają znikomą różnicę.
Wersja z dwoma poleceniami powinna być szybsza, dodając kolejne -ss przed plikiem wejściowym dla „szybkiego wyszukiwania”, po którym następuje dokładniejsze powolne wyszukiwanie.
źródło
-q:v 0
.Oto przydatny skrypt, który pomaga w automatycznym dzieleniu: Skrypt do dzielenia filmów za pomocą ffmpeg
źródło
Z mojego doświadczenia wynika, że nie używaj ffmpeg do dzielenia / łączenia. MP4Box, jest szybszy i lekki niż ffmpeg. Proszę, spróbuj. Np. Jeśli chcesz podzielić plik MP4 o wielkości 1400 MB na dwie części a 700 MB, możesz użyć następującego polecenia cmdl:
MP4Box -splits 716800 input.mp4
np. Do połączenia dwóch plików możesz użyć:Lub jeśli potrzebujesz podziału według czasu, użyj
-splitx StartTime:EndTime
:MP4Box -add input.mp4 -splitx 0:15 -new split.mp4
źródło
EndTime
niż-t
.http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg może być również przydatny. Również ffmpeg ma mukser segmentów, który może działać.
W każdym razie przypuszczam, że połączenie ich w jedno polecenie pozwoliłoby zaoszczędzić czas.
źródło
Nie ma dużej różnicy między tymi dwoma przykładami, które podałeś. Pierwszy przykład tnie wideo sekwencyjnie, w 2 krokach, podczas gdy drugi przykład robi to w tym samym czasie (używając wątków). Żadne szczególne przyspieszenie nie będzie zauważalne. Możesz przeczytać więcej o tworzeniu wielu wyników za pomocą FFmpeg
Co więcej, to, czego możesz użyć (w ostatnim FFmpeg), to muxer segmentacji strumienia, który może:
źródło
Oto prosty plik nietoperza systemu Windows do podzielenia przychodzącego pliku na 50 części. Każda część ma 1 minutę. Przepraszam za taki głupi scenariusz. Mam nadzieję, że lepiej jest mieć głupi skrypt Windows, zamiast go w ogóle nie mieć. Może to komuś pomoże. (Na podstawie „pliku bat for loop” z tej witryny).
źródło
ffmpeg
polecenia) przepisany jako pętla. Nie odpowiada to na pytanie, czy takie podejście lub pojedyncze polecenie „zaoszczędzi czas obliczeń i pamięć”.Nie testowałem ist, ale wygląda to obiecująco:
Podstawowy segmenter strumienia
Jest to oczywiście dzielenie AVI na segmenty o tym samym rozmiarze, co oznacza, że te fragmenty nie tracą jakości, nie zwiększają pamięci ani nie muszą być ponownie obliczane.
Używa również kopii kodeka - czy to oznacza, że może obsługiwać bardzo duże strumienie? Ponieważ to jest mój problem, chcę zepsuć moje avi, aby móc użyć filtra, aby pozbyć się zniekształceń. Ale całe avi działa godzinami.
źródło
Oto doskonały sposób na podzielenie wideo. Robiłem to już wcześniej i dobrze mi się to sprawdza.
ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4
(Dla cmd).shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')
(dla php).Postępuj zgodnie z tym i jestem pewien, że będzie działać idealnie.
źródło
-i
a po nim następują-ss
i-t
. Pytanie dotyczy jednak tego, jak skutecznie wyodrębnić wiele segmentów z tego samego pliku wejściowego, podczas gdy wyodrębniasz tylko jeden segment. Nie rozumiem, jak to odpowiada na pytanie.jednym prostym sposobem jest użycie opcji przycinania z interfejsem API opartym na adresie URL publikacji .
po przesłaniu filmu wystarczy ustawić przesunięcie początkowe i końcowe w adresie URL (so_2, eo_2) w następujący sposób:
spowoduje to natychmiastowe utworzenie nowych filmów, zaczynając od drugiej sekundy i długości 2 sekund. możesz w dowolny sposób dzielić filmy w ten sposób.
źródło
ffmpeg
. Jeśli nie masz naprawdę, naprawdę szybkiego połączenia internetowego, myślę, że konieczność przesłania całego filmu do usługi w chmurze, a następnie pobrania wyników, znacznie wydłuży czas przetwarzania. Nawet tak, to nadal nie jest odpowiedź na pytanie, które podejście zffmpeg
bardziej wydajne.