10

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

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

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

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

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

3 ответа3

12

mkvtomp4

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

Использует mpeg4ip или MP4Box, 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
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
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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .