script om Srt file toe tevoegen aan Mkv

tobo100

Gebruiker
Lid geworden
14 okt 2013
Berichten
156
betreft *.bat file

Op een website vond ik een (batch)code om Srt-files to tevoegen aan MKV-files
en deze code werkt perfect,zolang er maar geen spatie in de filename voorkomt

"Iemand" heeft deze code al eens gebruikt en is toen ook tegen dit probleem aangelopen
de persoon zei er het volgende over:

"Thank you for the help. I experienced errors when I read files like "I am Happy.mp4" and "I am Happy.srt" and fixed it by adding quotation marks to "%~1" and each of the "mkvTargetName%." variables. I also found out that mkvmerge needs to load only the idx file in sub/idx sets. Again, I appreciate the support."

volgens zijn zeggen heeft dit dus te maker met "quotation marks" rond de variabelen.
helaas is mijn engels niet zo goed om dit te vragen op de bron website.
zelf krijg ik het niet voor elkaar.
vandaar dat ik de vraag hier parkeer,
kan iemand mij hier mee helpen.
MKVzonderspaties.jpgMKVMet spaties.jpg
Code onderaan.

Outputfile zonder spaties
MKVzonderspaties.jpg

Met spaties gaat het fout
MKVMet spaties.jpg





Code:
@ECHO OFF
::'===========================================================
:: mkvmerger.bat
:: mkvmerge recipe.
::
:: Written by Shawn K. Hall
::
::'===========================================================
::setlocal enableDelayedExpansion
::'===========================================================
where /q mkvmerge.exe
IF NOT "%errorlevel%"=="0" GOTO nomkvmerge
::'===========================================================


::'===========================================================
:input
::'===========================================================
:: defaults
IF "%mkvTargetDir%"=="" SET mkvTargetDir=Done\
IF "%~1"=="" GOTO all
GOTO next
::'===========================================================


::'===========================================================
:next
IF /I "%~1"=="*"                    SHIFT&&GOTO all
IF /I "%~1"=="all"                  SHIFT&&GOTO all
IF /I "%~1"==""                     GOTO done
SET inparam=%~1
IF "%~1"==""                        GOTO none
SET "inparam2=%inparam:^*=%"
IF NOT "%inparam2%"=="%inparam%"  SHIFT&&GOTO many
SET inparam2=
GOTO process
::'===========================================================


::'===========================================================
:all
FOR %%x IN ("avi" "m4v" "mkv" "mp4" "mpeg" "mpegts" "mpg") DO (
  IF EXIST *.%%x FORFILES /M *.%%x /c "cmd /c CALL mkvmerger.bat ^"@file^""
)
GOTO next
::'===========================================================


::'===========================================================
:many
IF EXIST "%inparam%" FORFILES /M %inparam% /c "cmd /c CALL mkvmerger.bat ^"@file^""
GOTO next
::'===========================================================


::'===========================================================
:destexists
ECHO. The destination file already exists:
ECHO.   "%mkvTarget%"
ECHO. Are you sure you haven't already processed this file^?
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:none
ECHO. Error: You must pass the source video file or "^*" as an argument.
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:nomkvmerge
ECHO. Error: mkvmerge is either not installed or is not in the path.
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:process
SET "mkvSources=%~1"
SET mkvTarget=
SET "mkvTargetName=%~n1"
SET mkvTargetExt=.mkv
SET "mkvTarget=%mkvTargetDir%\%mkvTargetName%%mkvTargetExt%"
IF EXIST "%mkvTarget%" GOTO destexists
IF NOT EXIST "%mkvTargetDir%" MKDIR "%mkvTargetDir%"
ECHO.
ECHO.Starting with "%mkvTarget%"
:processing
IF EXIST "%mkvTargetName%.srt" SET "mkvSources=%mkvSources% %mkvTargetName%.srt"
IF EXIST "%mkvTargetName%.idx" SET "mkvSources=%mkvSources% %mkvTargetName%.idx"
IF EXIST "%mkvTargetName%.ogg" SET "mkvSources=%mkvSources% %mkvTargetName%.ogg"
IF EXIST "%mkvTargetName%.mp3" SET "mkvSources=%mkvSources% %mkvTargetName%.mp3"
IF EXIST "%mkvTargetName%.aac" SET "mkvSources=%mkvSources% %mkvTargetName%.aac"
mkvmerge.exe -o "%mkvTarget%" %mkvSources%
:processingDone
ECHO.Done with "%mkvTarget%"
ECHO.
GOTO done
::'===========================================================


::'===========================================================
:done
 
Laatst bewerkt:
Het is helemaal niet nodig om een tekst bestand aan een MKV toe te voegen.
Een .srt bestand is hoef je alleen maar hetzelfde te noemen als het .mkv bestand en deze in dezelfde map als het .mkv bestand te zetten.
 
Je wilt het er dus 'inbranden'?

Gebruik gewoon ffmpeg, die er ondersteuning voor heeft. Dan kan gewoon vanuit de command-line.
Code:
ffmpeg -i input.mp4 -vf subtitles=ondertitels.srt -c:a copy output.mp4

Uiteraard moet je wel ffmpeg geïnstalleerd hebben.
Dergelijke encodings, en technische aanpassingen aan video's pas ik altijd met ffmpeg toe. Vooral met WSL (Windows Subsystem for Linux) vind ik het een ideale combinatie.

Net uitgetest, en het werkt
 
Laatst bewerkt:
Beste Aar,

Dankjewel voor je reactie

Normaal gesproken doe ik dit met Mkvtoolnix
per mkv file een Srt en aanknopen, werkt prima.

Alleen deze geposte code doet dit zonder enige vorm van interactie
ik moet alleen zorgen dat de file namen gelijk zijn

De code werkt als een speer. Alleen niet met filenamen waar een spatie inzit
ook dit kan in wel omzeilen met total commander>>uitgebreid herbenoemen

Maar liefst zie ik een kleine aanpassing in deze code, zodat het ook werkt met spaties in de bestandsnamen
 
Easy-peasy!
Code:
ffmpeg -i input.mp4 -vf subtitles='ondertitel voor video.srt' -c:a copy output.mp4
 
Terug
Bovenaan Onderaan