Преобразование 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