Batch Convert .mkv na .mp4

10

Chcę wsadowo przekonwertować wszystkie pliki .mkv w folderze do .mp4 z VLC.

Powinien używać oryginalnego strumienia wideo / audio i, jeśli to możliwe, napisów .ass w .mkv. To nie jest tak naprawdę konwersja, to raczej zmiana kontenera - mój odtwarzacz nie może odczytać filmów MKV.

Jeśli zrobię tę konwersję ręcznie (ręcznie), to zadziała, ale mam wiele plików MKV do konwersji, więc zajęłoby to dużo czasu.

Przeszukałem w Internecie plik wsadowy, aby to zrobić, i znalazłem kilka. Próbowałem je zmodyfikować zgodnie z własnymi życzeniami, ale wszystkie próby, które próbowałem, właśnie utworzyły plik .mp4, który nie zawiera strumienia audio, a strumień wideo również nie może być renderowany przez wszystkie moje odtwarzacze multimedialne na komputerze.

Czy ktoś mógłby mi powiedzieć, jak ma wyglądać partia, aby działała z oryginalnym strumieniem wideo i audio (i może napisami .ass)?

Jestem tutaj
źródło
Na jakim systemie operacyjnym jesteś i czy koniecznie musisz korzystać z VLC? Ponadto ISO MP4 nie obsługuje napisów, o ile pamiętam - co należy z nimi zrobić?
slhck
na test możesz wypróbować innego gracza (mplayer / KMPlayer / BSPlayer)
Remus Rigo
Hamulec ręczny, to wszystko.
Sam
@Sam Handbrake ponownie zakoduje strumienie wideo i audio, pozostawiając w rezultacie złą jakość. Tego właśnie OP nie chciał.
slhck

Odpowiedzi:

13

mkvtomp4

Wygląda na mkvtomp4to, czego chcesz?

Używa mpeg4ip lub MP4Box, mkvtoolnix i ffmpeg programu GPAC do konwersji kłopotliwych plików mvv na mp4 . Konwersja nie koduje ponownie wideo i ponownie koduje dźwięk tylko wtedy, gdy nie używa kodeka AAC (można to zmienić za pomocą --a-kodek-audio).

Możesz pobrać wersje Windows i Linux ze strony Google Code. Będziesz jednak potrzebował dodatkowego oprogramowania.

Sprawdź witryny pod kątem plików do pobrania dla systemu Windows lub Linux. W systemie OS X wystarczy, brew install mkvtoolnix mp4boxjeśli masz Homebrew .

Nie spowoduje to jednak skopiowania napisów. Będziesz potrzebował dodatkowego kroku.


Partia FFmpeg

Jeśli mkvtomp4 nie działa dla ciebie, może również zrobić prosty plik wsadowy FFmpeg . W systemie Windows można pobrać kompilacje Zeranoe . W systemie Linux sprawdź FFmpeg ze źródeł pakietów. W OS X użyj brew install ffmpeg.

Następnie wystarczy zadzwonić:

ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4

Spowoduje to utworzenie prawidłowego kontenera MP4 bez ponownego kodowania. Pętlę nad plikami w razie potrzeby i dostępnych w systemie operacyjnym. Ta partia nie będzie jednak kopiować napisów.

W * nix możesz wykonać następujące czynności. Wystarczy utworzyć plik convert.sh:

#!/bin/bash
find /path/to/input/folder -iname '*.mkv' -print0 | while read -d '' -r file; do
    ffmpeg -i "$file" -c:v copy -c:a copy ${file%%.mkv}.mp4
done

W tym miejscu zastąp ścieżkę do folderu wideo. Zrób to za pomocą chmod +x convert.sh, a następnie uruchom za pomocą ./convert.sh.

W systemie Windows prawdopodobnie potrzebujesz dwóch plików wsadowych ( bezwstydna wtyczka stąd ), z których jeden to startconvert.bat:

for %%i IN (*.mkv) DO (convert-to-mp4.bat "%%i") 
pause

I taki, który dokonuje konwersji:

IF EXIST "%1.mp4" GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -c:v copy -c:a copy %1.mp4

:exit 
@echo %1.mp4 already exists

Zapisz oba w folderze wideo. Po prostu uruchom startconvert.batz folderu, z którego chcesz rozpocząć konwersję.


Napisy na filmie obcojęzycznym

Jeśli chcesz dodać napisy, może być potrzebna procedura ręczna, jeśli poniższe czynności nie działają:

ffmpeg -i input.mkv -c:a copy -c:v copy -map 0 output.mp4

Aby wyodrębnić napisy, użyj:

mkvextract tracks input.mkv 3:subtitles.srt

Zakłada się, że plik naprawdę zawiera napisy o numerze ścieżki 3 i można je wyeksportować do formatu SRT. Aby sprawdzić, czy plik naprawdę zawiera napisy na ścieżce 3, użyj mkvmerge -i input.mkv.

Następnie użyj MP4Box, aby ponownie dodać napisy do pliku MP4.

mp4box -add input.mp4 -add subtitles.srt -new output.mp4
slhck
źródło
Dla przypomnienia przetestowałem FFmpeg i ekstrakcję napisów na OS X i działało bezbłędnie.
slhck
Użyłem ffmpeg dla Windows. Ale czy jest partia, więc automatycznie konwertuje / mux wszystkie pliki w folderze do mp4 z tą samą nazwą pliku? A może partia, która konwertuje plik podczas przeciągania i upuszczania
2

To jest poprawka części odpowiedzi, którą slhck dał (i dzięki, slhck!), Ponieważ odkryłem, że polecenie nie działa dla najnowszej (przy tym piśmie) ffmpeg - może parametry zmieniły się między wersjami?

W systemie Windows 7 za pomocą ffmpeg v.20130103-git-9e36d9e-win64-static (rozpakuj go za pomocą narzędzia 7zip), który można znaleźć na stronie http://ffmpeg.zeranoe.com/builds/ z kolei na stronie http://ffmpeg.org /download.html , następujące polecenie przekonwertowało plik .mov (pobrany z iPhone'a) na plik .mp4:

ffmpeg -i test.mov -vcodec copy -acodec copy test.mp4

Przekonałem się, że zmiana tej części .mp4 na .avi również działała, zmieniając ją na kontener .avi. W przypadku dowolnego kontenera docelowego użycie paramaterów „-vcodec copy -acodec copy” zdaje się kopiować strumienie źródłowe tylko do nowego kontenera (w celu), więc jest to konwersja bezstratna (i przypuszczam, że tak byłoby w przypadku różnorodne pojemniki docelowe).

Te ulepszenia partii, które dał nam slhck, również działały dla mnie:

callConvert.bat:

for %%i IN (*.mov) DO (convert.bat "%%i")
pause

convert.bat:

IF EXIST %1.mov GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -vcodec copy -acodec copy %1.avi

:exit 
@echo %1.avi already exists
r_alex_hall
źródło
1
Nie ma różnicy między -c:ai -acodec, lub -c:vi -vcodec. W rzeczywistości nadal używam tego pierwszego, ponieważ jest to zalecana składnia i oba są wymienione w dokumentacji FFmpeg . Pamiętaj, że konwersja kontenera na AVI może zepsuć się dla wielu kodeków wideo i audio, ponieważ pliki AVI nie obsługują kodowania predykcyjnego (które wykorzystuje wideo H.264 - takie, które oferuje iPhone). Jeśli nie używasz kontenera MP4 lub MOV jako celu, zawsze lepiej jest przekodować.
slhck 21.01.2013
„JEŚLI ISTNIEJE% 1.mov Wyjście GOTO” powinno brzmieć „% 1.avi” (lub jakikolwiek inny format docelowy zamiast formatu źródłowego), prawda? Poza tym to działało dla mnie świetnie, dziękuję!
kjosh
0

Stare pytanie, ale oto moja odpowiedź, dla przypomnienia. MP4 nie może tworzyć napisów, chyba że stanowią część klatki wideo, ale w ten sposób przekonwertowałem pliki .mkv na .mp4:

foreach($inputFile in get-childitem -recurse -Filter *.mkv) {
    $outputFileName = [System.IO.Path]::GetFileNameWithoutExtension($inputFile.FullName) + ".mp4";
    $outputFileName = [System.IO.Path]::Combine($inputFile.DirectoryName, $outputFileName);

    $progDir = ${env:ProgramFiles(x86)};
    if ($progDir -eq $null) {
        $progDir = $env:ProgramFiles;
    }

    $processName = $progDir + "\VideoLAN\VLC\vlc.exe";
    $processArgs = "-I dummy -v `"$($inputFile.FullName)`" --sout=#transcode{}:standard{access=`"file`",mux=`"mp4`",dst=`"$outputFileName`"} vlc://quit"

    start-process $processName $processArgs -wait
}

Zapisz go jako mkv2mp4.ps1 i upuść w folderze, z którym pracujesz. Kliknij prawym przyciskiem myszy i „Otwórz w Powershell”, a zrobi to samo.

To pierwszy raz, kiedy nawet spojrzałem na Powershell (i ostatni mam nadzieję - dlaczego MS nie mógł po prostu przenieść Bash ?!), ale działa dla mnie i opiera się na kodzie, który tu znalazłem: https: // wiki .videolan.org / How_to_Batch_Encode / # Powershell

miken32
źródło
Bez względu na to, jakiego wiersza poleceń używasz, powinieneś umieścić go w Makefile- aby móc go uruchomić ponownie i przekonwertować tylko nowe źródła, a także aby móc wykonywać wiele konwersji równolegle (aby korzystać ze wszystkich procesorów) ).
Mikhail T.,