Преобразование FFMPEG MKV в MP4 теряет субтитры

В настоящее время пытаюсь конвертировать мою библиотеку MKV в MP4 (Iphone 6 плюс)

Мне удалось добраться до преобразования MKV в MP4, но мне не хватает части субтитров (SRT)

Вот мой код:

dir/b/s *.mkv >mkvlist.txt   ///////// this gets a list of all the mkv files on the directory

for /F "delims=;" %%F in (mkvlist.txt) do ffmpeg.exe  -i "%%F" -format mp4 -vcodec copy -acodec aac -strict -2 -sn "%%~dF%%~pF%%~nF.mp4"   ///////////// this makes the conversion

del mkvlist.txt     ////// this deletes the txt file

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

2 ответа

MP4 не поддерживает SRT. Вы можете использовать softtsubs или hardsubs.

софтсабах

Субтитры, которые состоят в виде отдельного потока в файле. Они могут быть включены / выключены проигрывателем и не требуют перекодирования видеопотока.

ffmpeg -i input.mkv -c copy -c:s mov_text output.mp4

Поддержка проигрывателем синхронизированных текстовых программных субтитров в MP4 может быть довольно слабой. Вам просто нужно попробовать.

хардсабах

Hardsubs "записаны" в видео, поэтому видео необходимо перекодировать.

ffmpeg -i input.mkv -vf subtitles=input.mkv output.mp4

См. Документацию фильтра susbtitles для получения дополнительной информации, такой как, как выбрать определенный поток субтитров, если их несколько.

У меня была похожая проблема при переходе с MP4 на MKV из некоторых файлов mp4, которые я скопировал с помощью Handbrake. Сначала я обратился к https://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/subtitle_options, который подразумевал определенные форматы субтитров для mkv против mp4. После игры с преобразованиями ass и mov_text, которые не работали, я протестировал некоторые файлы и заметил, что появился формат dvd_subtitle. После долгих тренировок поработали следующие.

ffmpeg -i "\\server\directory\Sourcefile.mp4" -c:v copy -c:a copy -c:s dvd_subtitle "\\server\directory\Outputfile.mkv"

Надеюсь, поможет.

Надеюсь, это поможет вам автоматизировать процесс. Этот код преобразует файлы видео в формате.mp4 и субтитров.srt в файл.mkv со встроенными субтитрами.

Пакетный файл.

Просто поместите на него 2 файла одновременно -.mp4 и.srt, чтобы получить видео.mkv со встроенными субтитрами.

Если вы хотите исходное / низкое качество видео, просто прокомментируйте / раскомментируйте соответствующую строку в коде.

Помимо всего прочего, я сделал асинхронный вызов msgBox. Кому это нужно - скопируйте в свои источники.

По какой-то причине он не принимает круглые скобки () в именах файлов. Остальные символы я не проверял.

    @echo off
    if "%~x1"==".mp4" (
        set mp4=%~n1
        set path=%~d1%~p1
    )
    if "%~x2"==".mp4" (
        set mp4=%~n2
        set path=%~d1%~p1
    )
    if "%~x1"==".srt" set srt=%~1
    if "%~x2"==".srt" set srt=%~2
    if not "%mp4%"=="" (
        if not "%srt%"=="" (
            :: If your original ffmpeg.exe file located in system32 directory then replace "%~dp0ffmpeg.exe" to ffmpeg
            :: original quality
            ::"%~dp0ffmpeg.exe" -i "%path%%mp4%.mp4" -i "%srt%" -ar 48000 -vcodec libx264 -disposition:s:0 default -scodec copy "%path%%mp4%.mkv"
            :: low quality
            "%~dp0ffmpeg.exe" -i "%path%%mp4%.mp4" -i "%srt%" -ar 48000 -ab 128k -ac 2 -vcodec libx264 -s 480x240 -b 256k -disposition:s:0 default -scodec copy "%path%%mp4%.mkv"
            call :msgbox "File %path%%mp4%.mkv completed."
        ) else call :msgbox "File .srt missing in the input parameters`r`nJust drop 2 files with extensions:`r`n.mp4 - video and .srt - subtitles`r`nto this batch file to get .mkv with subtitles"
    ) else call :msgbox "File .mp4 missing in the input parameters`r`nJust drop 2 files with extensions:`r`n.mp4 - video and .srt - subtitles`r`nto this batch file to get .mkv with subtitles"
    goto :eof
    :msgBox [msgText]
    C:\Windows\System32\mshta.exe vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -Command """"[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null;"""" """"[System.Windows.Forms.MessageBox]::Show(\""""%~1\"""")"""""",0,false:close")
    exit /B
Другие вопросы по тегам