Czy zamiast wycinać filmy dla określonych numerów klatek zamiast używać -ss
i -to
wyszukiwać parametry, które wydają się niezbyt dokładne? Na przykład;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[80. ramka i 560. ramka w komplecie. Łącznie tworzy (560 - 80 +1) klatek]
Po odpowiedziach i drobnych poszukiwaniach wypróbowałem kilka poleceń. Ale jak dotąd nie mogłem znaleźć akceptowalnego sposobu.
Jeśli ktoś chce wyciąć strumień wideo między 250 a 750 klatkami, jest to odpowiedni sposób. Daje 501 klatek jako wynik:
Uwaga: film.mp4 ma 25 klatek na sekundę, a częstotliwość próbkowania audio 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
Zgodnie z oczekiwaniami wyjście ma dokładnie 20 sekund.
Używając tej samej metody dla dźwięku:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Nieoczekiwanie ten ma bardzo słabą dokładność. Powinien dać mi 960001 (960k + 1) próbek, co odpowiada 20 sekundom dźwięku. Ale zamiast tego wynik wynosił 20,505 sekundy i zawiera 984240 próbek. Ponadto, jeśli zwiększę czas trwania, błąd również wzrośnie.
Następnie spróbowałem użyć parametru -ss -to do wycięcia strumienia audio:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Stary klasyczny sposób działa znacznie lepiej. Wyjście trwało 20,003 sekundy i zawiera 960144 próbek. Ponadto wydłużenie czasu trwania nie zwiększa błędu, błąd jest stały, zawsze istnieje 144 nadwyżek próbek z tym plikiem wejściowym.
Podsumowując:
select
filtr działa dobrze przez większość czasu, ale wybór nie. Klasyczne -ss
parametry działają lepiej w przypadku dźwięku, ale nie są dokładne w próbkach. Ponadto nie można używać razem -vf select
i -ss
parametrów razem, ponieważ -ss
wpłynie to zarówno na strumienie audio, jak i wideo, a my chcemy, aby wpływały tylko na dźwięk.
Aby dokładnie wyciąć plik multimedialny, muszę wykonać następujące 3 kroki:
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy movie-between_10th_and 20th_seconds.webm
To daje najdokładniejsze wyniki. Film ma długość 20 000 sekund, a dokładność klatek Audio ma długość 20,003 sekundy i próbkę 960144. Niezupełnie pasuje do strumienia wideo, ale jest OK. Jest tylko 144 nadwyżki próbek. Największym minusem jest to, że za każdym razem, gdy chcę wyciąć plik, muszę wysłać 3 polecenia do prostej pracy i tworzy on dwa niepotrzebne pliki: a_stream.webm i v_stream.webm. A select
filtr nie działa na niektórych plików wejściowych próbowałem. Wykonuje zadanie pomyślnie (?), Ale nigdy nie zatrzymuje procesu kodowania, więc muszę za każdym razem zamykać wiersz polecenia.
select
i aselect
filtrować strumienie wideo i audio. Select
ma dokładność klatek dla wideo, ale aselect
nie jest dokładny w próbce. W rzeczywistości jest to dalekie od dokładności. Daje to znacznie gorsze wyniki niż używanie prostych -ss
-to
parametrów. Z tego powodu na razie używam kombinacji select
filtra i -ss
-to
parametrów, aby uzyskać jak najdokładniejsze cięcie. Ale jest to nieczysty sposób, aby to zrobić. Proszę spojrzeć na mój pierwszy post, dodałem kilka linii poleceń i ich wyniki