Пакетное преобразование .mkv в .mp4

10

Я хочу конвертировать все файлы .mkv в папке в .mp4 с VLC.

Он должен использовать исходный видео- / аудиопоток и, если возможно, субтитры .ass .mkv. На самом деле это не конверсия, это больше похоже на смену контейнера - мой плеер не может читать видео MKV.

Если я выполняю это преобразование вручную (вручную), оно работает, но у меня есть много MKV-файлов для преобразования, так что это займет много времени.

Я искал в интернете пакетный файл, чтобы сделать это, и я нашел несколько. Я попытался изменить их по своему желанию, но все попытки, которые я пытался, просто создали файл .mp4, который не содержит аудиопоток и видеопоток, также не может быть воспроизведен всеми моими медиаплеерами на ПК.

Так может кто-нибудь сказать мне, как должна выглядеть партия, чтобы она работала с оригинальным видео и аудио потоком (и, может быть, .ass субтитрами)?

Я здесь
источник
На какой операционной системе вы работаете, и вам обязательно нужно использовать VLC? Кроме того, насколько я помню, ISO MP4 не поддерживает субтитры - что с ними делать?
slhck
для теста вы можете попробовать другого игрока (mplayer / KMPlayer / BSPlayer)
Remus Rigo
Ручник, вот и все.
Сэм
@Sam Handbrake перекодирует видео и аудио потоки, в результате чего вы получите плохое качество. Кроме того, это то, что ОП специально не хотел.
Slhck

Ответы:

13

mkvtomp4

Похоже mkvtomp4это то, что вы хотите?

Использует mpeg4ip или MPACBox, mkvtoolnix и ffmpeg из GPAC для преобразования проблемных файлов mkv в mp4 . Преобразование не перекодирует видео, а перекодирует аудио только в том случае, если не используется кодек AAC (можно переопределить это поведение с помощью --audio-codec).

Вы можете скачать версии для Windows и Linux на странице кода Google. Вам понадобится дополнительное программное обеспечение, хотя.

Проверьте сайты для загрузки для Windows или Linux. На OS X вам нужно только brew install mkvtoolnix mp4boxесли у вас есть Homebrew .

Это не будет копировать ваши субтитры, хотя. Вам понадобится дополнительный шаг.


Партия FFmpeg

Если mkvtomp4 не работает для вас, может подойти и простой командный файл FFmpeg . Для Windows вы можете скачать сборки Zeranoe . В Linux проверьте FFmpeg из источников пакетов. В OS X используйте brew install ffmpeg.

Тогда просто позвоните:

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

Это создаст допустимый контейнер MP4 без перекодирования. Зацикливайте файлы, когда это необходимо и доступно вашей операционной системе. Однако эта партия не будет копировать субтитры.

В * nix вы можете сделать следующее. Просто создайте файл 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

Замените путь к вашей папке с видео здесь. Сделайте его исполняемым с chmod +x convert.sh, затем запустите его с ./convert.sh.

В Windows вам, вероятно, понадобятся два пакетных файла ( отсюда бесстыдный плагин ), один из которых startconvert.bat:

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

И тот, который выполняет преобразование:

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

Сохраните оба в папке с видео. Просто запустите startconvert.batиз папки, из которой вы хотите начать конвертацию.


Субтитры

Если вы хотите добавить субтитры, вам может потребоваться ручная процедура, если следующее не работает для вас:

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

Чтобы извлечь субтитры, используйте:

mkvextract tracks input.mkv 3:subtitles.srt

Это предполагает, что ваш файл действительно содержит субтитры с номером дорожки с номером 3, и они могут быть экспортированы в формат SRT. Чтобы проверить, действительно ли файл содержит субтитры на дорожке 3, используйте mkvmerge -i input.mkv.

Затем используйте MP4Box для повторного добавления субтитров в файл MP4.

mp4box -add input.mp4 -add subtitles.srt -new output.mp4
slhck
источник
Для протокола, я протестировал FFmpeg и извлечение субтитров на OS X, и он работал безупречно.
slhck
Я использовал ffmpeg для Windows. Но есть ли пакет, чтобы он автоматически преобразовывал / mux все файлы в папке в mp4 с тем же именем файла? Или, может быть, пакет, который преобразует файл
2

Это небольшая часть ответа, который дал slhck (и спасибо, slhck!), Потому что я обнаружил, что команда не работает для последней (на момент написания) ffmpeg - может быть, параметры изменились между версиями?

В Windows 7, используя ffmpeg v.20130103-git-9e36d9e-win64-static (распакуйте его с помощью утилиты 7zip), найденную через http://ffmpeg.zeranoe.com/builds/ по очереди через http://ffmpeg.org /download.html , следующая команда преобразовала файл .mov (взятый из iPhone) в файл .mp4:

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

Я обнаружил, что изменение части .mp4 этого на .avi также работает, чтобы изменить его на контейнер .avi. В любом целевом контейнере использование этих параметров «-vcodec copy -acodec copy», по-видимому, копирует только исходные потоки в новый контейнер (в целевой), так что это преобразование без потерь (и я предполагаю, что это будет в случае с разнообразие целевых контейнеров тоже).

Эти настройки пакетов, которые дал slhck, также сработали для меня:

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
источник
1
Там нет разницы между -c:aи -acodec, или -c:vи -vcodec. Фактически, я все еще использую первый сегодня, так как это рекомендуемый синтаксис, и оба упомянуты в документации FFmpeg . Обратите внимание, что преобразование контейнера в AVI может нарушить работу многих видео- и аудиокодеков, поскольку в файлах AVI отсутствует поддержка интеллектуального кодирования (которое использует видео H.264 - то, что дает вам iPhone). Если вы не используете контейнер MP4 или MOV в качестве цели, всегда лучше перекодировать.
Slhck
«ЕСЛИ EXIST% 1.mov GOTO exit» должен читать «% 1.avi» (или каков целевой формат вместо исходного формата) вместо этого, нет? Кроме того, это отлично сработало для меня, спасибо!
kjosh
0

Старый вопрос, но вот мой ответ, для протокола. MP4 не может делать субтитры, если они не являются частью видеокадра, но вот как я конвертирую файлы .mkv в .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
}

Сохраните его как mkv2mp4.ps1 и поместите в папку, с которой вы работаете. Щелкните правой кнопкой мыши и «Открыть в Powershell», и он сделает свое дело.

Это первый раз, когда я даже смотрю на Powershell (и последнее, на что я надеюсь - почему MS не может просто портировать Bash ?!), но он работает для меня и основан на коде, который я нашел здесь: https: // wiki .videolan.org / How_to_Batch_Encode / # Powershell

miken32
источник
Независимо от того, какую командную строку вы используете, вы должны поместить ее в Makefile- чтобы иметь возможность перезапускать ее и конвертировать только новые источники, а также чтобы иметь возможность запускать несколько преобразований параллельно (чтобы использовать все ваши процессоры ).
Михаил Т.