Staram się korzystać z FFmpeg, aby podzielić wideo w oparciu o pewne start_time
i end_time
wejść i zastąpić te z innych plików wideo. Na przykład, dla wprowadzenia 10 15
będę musiał zamienić DOKŁADNE sekundy 10 to 15
innym wideo.
OK. Co przychodzi mi na myśl, to:
- Najpierw podziel wideo (w tym przypadku 0-10, 10-15 i 15-koniec)
- Zamień 10-15 na inne wideo
- Scal wszystkie pod-filmy z powrotem
Pierwsze pytanie: czy to najlepsze i najszybsze rozwiązanie? Czy mamy łatwiejsze polecenie lub inne narzędzia do zastąpienia określonego czasu w filmie innym filmem?
Drugie pytanie: Zakładając, że FFmpeg jest realnym rozwiązaniem, kiedy po prostu używam polecenia ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4
, mój kod przetwarzania wideo nie może odczytać i przetworzyć pliku. Użyłem mediainfo
narzędzia do porównania dwóch plików i zauważyłem różnice w rozmiarach nagłówka, podczas gdy wszystkie rzeczy związane z kodekiem wideo były takie same. Zauważyłem, że ROZMIAR NAGŁÓWKA jest inny, co najwyraźniej powoduje problem. Czy istnieją sposoby na wymuszenie, aby rozmiar nagłówka (oprócz kodeków) był taki sam?
AKTUALIZACJA: Oto oryginalny .mp4
plik, który działa dobrze w emulatorze.
.mp4
razie potrzeby mogę jednak udostępnić oryginalny plik.Odpowiedzi:
Używanie
trim
iconcat
- plików źródłowych z różnymi kodekamiW tym celu należy upewnić się, że poszczególne pliki mają tę samą rozdzielczość, a najlepiej takie same próbkowanie klatek i chroma itp. Zapobiegnie to błędom lub usterkom podczas konkatenacji.
Możesz zrobić wszystko za jednym razem, bez dzielenia pliku, używając filtrów
trim
iconcat
:Tutaj
trim
służy do określania poszczególnych części wejściowych strumieni wideo (0:v
,1:v
), które później chcesz połączyć. Te części są nazwanev0
poprzezv2
. (setpts
Filtr resetuje znaczniki czasu tych poszczególnych części na 0, co jest wymagane do konkatenacji). Później łączymy trzy części.Jeśli chcesz przyciąć od określonego znacznika czasu do końca, użyj
trim=start=15
zamiast określać zakres.Jeśli Twoje pliki zawierają dźwięk, musisz przyciąć te strumienie osobno:
Pamiętaj, że w tym przypadku wideo i audio zostaną ponownie zakodowane - upewnij się, że określono odpowiednie docelowe parametry wyjściowej jakości (np.
-crf
Dla x264, x265 lub libvpx-vp9). Możesz przeczytać więcej na ten temat na Wiki FFmpeg, np. Dla VP9 lub H.264 .Korzystanie z poszczególnych segmentów
Jeśli chcesz podzielić klipy, a następnie ponownie je złożyć:
Jeśli pliki zawierają dźwięk, zastosuj to samo podejście jak powyżej:
Spowoduje to ponowne kodowanie strumienia wideo. Jest to nieco prostsze, ale poza tym powinno być równoważne powyższej metodzie.
Korzystanie z
concat
demuxeraZasadniczo możesz także próbować połączyć strumienie bitów bez ich ponownego kodowania, korzystając z demuxera konkatencyjnego. Utwórz plik o nazwie
concat.txt
i dodaj następujące wpisy (odpowiadające klipom wideo utworzonym powyżej):Następnie połącz te pojedyncze pliki:
Wymaga to jednak, aby twoje klipy miały ten sam kodek, rozdzielczość, szybkość klatek itp. - więc nie działa z wszystkimi rodzajami źródeł heterogenicznych.
Za pomocą
concat
protokołuPowyższy rodzaj konkatenacji na poziomie pliku można również osiągnąć przy użyciu
concat
protokołu, z takimi samymi ograniczeniami jak powyżej (ten sam kodek, rozdzielczość itp.):Aby uzyskać więcej informacji na temat konkatenacji, przeczytaj odpowiednią stronę Wiki FFmpeg .
źródło
concat
metody powoduje błąd:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
concat
demuxera składnia była inna. Naprawiono teraz. Aby przejść do końca, skorzystajtrim=start=15
z dokumentacji filtru przycinania: ffmpeg.org/ffmpeg-filters.html#trim - jeśli chodzi o problemy z timingiem, to naprawdę zależy od materiału źródłowego. Nie miałem problemów z połączeniem przesłanego klipu.