Chcę połączyć dwa pliki MP4, aby utworzyć jeden. Strumienie wideo są kodowane w h264, a dźwięk w aac. Nie mogę ponownie zakodować filmów do innego formatu ze względów obliczeniowych. Ponadto nie mogę używać żadnych programów GUI, wszystkie operacje muszą być wykonywane za pomocą narzędzi wiersza poleceń systemu Linux. FFmpeg nie może tego zrobić dla plików MPEG4, więc zamiast tego użyłem MP4Box:
MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4
Niestety wszystko się pomieszało. Pomyślałem, że problem polega na tym, że dźwięk był w aac, więc transkodowałem go w formacie mp3 i ponownie użyłem MP4Box. W tym przypadku dźwięk jest w porządku przez pierwszą połowę newvideo.mp4
(odpowiadający video1.mp4
), ale wtedy nie ma dźwięku i nie mogę również nawigować w filmie.
Moja kolejna myśl była taka, że w strumieniach audio i wideo występowały niewielkie rozbieżności w długości, które powinienem naprawić. Tak więc dla każdego wejściowego wideo podzieliłem strumienie wideo i audio, a następnie połączyłem je z opcją -shortest w FFmpeg.
Tak więc dla pierwszego filmu uruchomiłem:
avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
avconv -y -i videostream1.mp4 -i audiostream1.m4a -c copy -shortest video1_aligned.mp4
Podobnie w przypadku drugiego wideo, a następnie wykorzystano MP4Box jak poprzednio. Niestety to też nie działało. Jedyny sukces, jaki odniosłem, to dołączenie strumieni wideo osobno (tj. Videostream1.mp4 i videostream2.mp4) oraz strumieni audio (tj. Audiostream1.m4a i audiostream2.m4a), a następnie dołączyłem do wideo i audio w końcowym pliku. Jednak synchronizacja zostanie utracona w drugiej połowie filmu. Konkretnie, istnieje 1 sekundowe opóźnienie audio i wideo. Wszelkie sugestie są bardzo mile widziane.
źródło
Odpowiedzi:
Najlepszym obecnie sposobem na to jest demuxer konkat . Najpierw utwórz plik o nazwie
inputs.txt
tak sformatowany:Następnie po prostu uruchom następującą komendę ffmpeg:
Zobacz także konkatenację w
ffmpeg
FAQ .Trzymam poniższe dla korzyści każdego, kto używa starszych wersji ffmpeg.
Najnowsze wersje ffmpeg potrafią to zrobić: najpierw musisz przełożyć pliki na strumienie transportowe MPEG (dość lekki procesor, ponieważ zmienia tylko format kontenera):
Jeśli to powoduje błąd dotyczący h264, może być konieczne użycie:
Musisz to zrobić osobno dla każdego pliku wejściowego. Aby połączyć pliki razem, użyj:
Jeśli spowoduje to błąd dotyczący AAC, być może będziesz musiał użyć
Jeśli twój system obsługuje nazwane potoki, możesz to zrobić bez tworzenia plików pośrednich.
Będziesz musiał wykonać następujące czynności w trzech oddzielnych wirtualnych terminalach:
Jeśli output.mp4 już istnieje, trzeci ffmpeg zapyta, czy chcesz go zastąpić, ale zrobi to po uzyskaniu dostępu do FIFO , a to spowoduje zamknięcie pierwszego ffmpegs. Upewnij się więc, że wybrałeś nieużywaną nazwę pliku wyjściowego.
Może to nie działać, jeśli pliki wejściowe są różne - uważam, że różnice w szybkości transmisji są OK, ale rozmiar klatki, częstotliwość klatek itp. Muszą się zgadzać.
źródło
*** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
to wiadomość, którą widzę teraz podczas bieganiaffmpeg
avconv
W przypadku mp4 jedynym działającym rozwiązaniem, jakie znalazłem, było MP4Box z pakietu gpac
lub polecenie jest
z mencoderem i avconvem nie mogłem sprawić, by działało :-(
źródło
Dzięki za skrypt dvo. To był dla mnie świetny punkt wyjścia. Nie miałem problemu z używaniem nazwanych potoków, więc dostosowałem skrypt do ich używania. Dodatkowo poprawiłem go, aby działał z nazwami plików ze spacjami. Dane wyjściowe do nazwanych potoków nie są przesyłane, dopóki nie zaczniesz z nich czytać, stąd potrzeba podłożenia początkowych zadań remuxu znakiem & przed ostatnim wywołaniem avconv. Ponadto nie zapomnij użyć opcji -c copy, bo w końcu przekodujesz całą partię.
źródło
Na komputerze Mac (macOS 10.13 High Sierra) z powodzeniem zastosowałem następujące:
Zmień kolejność jak wyżej, jeśli to konieczne, podobnie (zwróć uwagę, że plik ./ został usunięty - ścieżka spowodowała, że ffmpeg zgłosi błąd niebezpiecznej nazwy pliku).
Następnie musiałem usunąć kodek i szybkość transmisji określoną dla domyślnego ffmpeg MacPorts, aby go polubić:
źródło
Oto jedna linijka, która sprawia, że jest to o wiele łatwiejsze. Robi wszystko, co trzeba zrobić, aby w końcu dostarczyć Ci jeden wynikowy plik wideo. Twoje zdrowie!
źródło
Dzięki evilsoup; oto mały skrypt automatyzujący proces, wykorzystujący najnowszą wersję
avconv
.BTW, nazwane potoki nie działały dla mnie (wyjście do nich utknęło).
źródło
Cieszę się wielkim sukcesem z
być może trzeba nieco zmienić kolejność mylist.txt
wersja ffmpeg 2.2.3
źródło