Пакетне перетворення .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 або MP4Box, mkvtoolnix та ffmpeg GPAC для перетворення проблемних файлів mkv в mp4 . Перетворення не перекодує відео, а лише перекодує звук лише у тому випадку, якщо він не використовує кодек AAC (можна змінити таку поведінку за допомогою --audio-codec).

Версії Windows та Linux можна завантажити на сторінці Google Code. Вам знадобиться додаткове програмне забезпечення.

Перевірте сайти на завантаження для 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 вам, ймовірно, потрібні два файли Batch (тут безсоромний штекер ), один з яких 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

Для запису я перевірив 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

1
Немає різниці між -c:aі -acodec, або -c:vі -vcodec. Насправді я все ще використовую колишній сьогодні, оскільки це рекомендований синтаксис, і обидва згадані в документації FFmpeg . Зауважте, що перетворення контейнера в AVI може порушитись для багатьох відео- та аудіокодеків, оскільки у файлах AVI відсутня підтримка передбачуваного кодування (яке використовує H.264 відео - те, яке надає вам iPhone). Якщо ви не використовуєте контейнер MP4 або MOV в якості цілі, завжди краще повторно кодувати.
slhck

"ЯКЩО ВІДСТАВЛЯЄТЬ% 1.mov GOTO вихід", слід замість цього "% 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


Який би командний рядок ви не використовували, вам слід вводити його всередину Makefile- щоб мати змогу повторно його перетворювати та конвертувати лише нові джерела, а також мати можливість паралельно запускати кілька конверсій (використовувати всі ваші процесори) ).
Михайло Т.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.