Chcę scalić filmy w rozmiarze dwudziestu (20) partii. Używam komputera z systemem Linux. Filmy są w formacie MP4 i umiarkowanej jakości. Niektórym brakuje nawet strumienia audio. Do tej pory próbowałem ffmpeg
, mencoder
, cvlc/vlc
i MP4Box
. Chcę napisać skrypt wiersza polecenia, aby to osiągnąć, ponieważ wykonuję przetwarzanie wsadowe.
Głównym problemem jest to, że niektóre rozwiązania, które próbowałem, działają dobrze w przypadku dwóch filmów, niektóre działają dobrze w przypadku filmów ze strumieniem audio, a jeszcze inne działają dobrze w przypadku niektórych innych podzbiorów mojego zestawu wideo. Nie udało mi się jednak znaleźć kompleksowego rozwiązania dla tego zadania.
ffmpeg
, w tym filtrów i protokołów plików. Próbowałem także użyćconcat
funkcjicvlc/vlc
. Próbowałem równieżconcat
funkcjimencoder
. Wszystkie działały częściowo. To w końcu pomogło mi rozwiązać problem.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Odpowiedzi:
Używam
mkvmerge
do łączenia wielu plików MP4 w jeden:źródło
.mkv
pliku wyjściowego, ponieważ jest to kontener Matroska niezależnie od tego, jakie rozszerzenie dajesz.mkvmerge
: tipsonubuntu.comMożesz to zrobić za pomocą
ffmpeg
:referencje i więcej informacji
źródło
To rozwiązało sprawę: https://stackoverflow.com/a/22324018/5014767
melt
to świetne narzędzie do wiersza poleceń. Oto stronaEdytuj z komentarzy: Poleceniem, które rozwiązało mój problem, było to
melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
źródło
Napisałem mały skrypt powłoki do konkatowania MP4 bez transkodowania przy użyciu ffmpeg.
To tworzy pliki pośrednie w kontenerze MPEG, a następnie łączy je w MP4.
źródło
for f in *.MP4
bez użycials
. (Zawsze powinieneś unikać używanials
skryptów z kilku ważnych powodów; istnieją lepsze opcje). Ponadto używaj cudzysłowów dla zmiennych, chyba że masz pewność, że nie ma spacji ani innych znaków specjalnych, więc"${f}"
(lub po prostu"$f"
) zamiast cudzysłowów$f
.CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
nie działa dobrze z nazwami plików 1, 2, 3 ... 10 ... 20. Kończy je parsowanie jako 1, 10 ... 2, 20 ... itd. Sugeruję,CONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")
że zapewni to porządek .Utwórz plik files.txt ze wszystkimi plikami, które chcesz połączyć w następującej formie (linie zaczynające się od # są ignorowane):
Pamiętaj, że mogą to być ścieżki względne lub bezwzględne. Następnie możesz strumieniowo skopiować lub ponownie zakodować swoje pliki:
źródło
Mój skrypt, wyłącznie w
bash
iffmpeg
. Ponownie koduje pliki podane w wierszu poleceń w jeden.Wymaga, aby pliki były tej samej rozdzielczości. Akceptuje różne rotacje metadanych, co
ffmpeg concat:
nie.źródło
Stworzyłem skrypt w języku Python, który przy użyciu moviepy może łączyć także podsekcje (przydatne, jeśli chcesz na przykład usunąć niektóre części z filmu).
Używaj go z:
źródło
Oprócz odpowiedzi Maythuxa od :
Oznacza to, że filmy, które mają zostać połączone, wykorzystują jeden z wyżej wymienionych kontenerów wideo (do których dodam MPEG-4 część 14 dla osobistego doświadczenia), możesz po prostu:
źródło