diff --git a/R128.au3 b/R128.au3 index c2a569b3e7a2e99bf8d885ddf1b9e38765f4bc21..359ce52070f00b1721f7e33936c01d801aae6021 100644 --- a/R128.au3 +++ b/R128.au3 @@ -2,7 +2,7 @@ #AutoIt3Wrapper_Icon=Icons\peakmeter.ico #AutoIt3Wrapper_Res_Comment=Measure loudness with ffmpeg according to R128. #AutoIt3Wrapper_Res_Description=Measure loudness with ffmpeg according to R128. -#AutoIt3Wrapper_Res_Fileversion=1.0.0.8 +#AutoIt3Wrapper_Res_Fileversion=1.1.0.9 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y #AutoIt3Wrapper_Res_CompanyName=Norddeutscher Rundfunk #AutoIt3Wrapper_Res_LegalCopyright=Conrad Zelck @@ -15,44 +15,125 @@ #Au3Stripper_Parameters=/mo #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <AutoItConstants.au3> +#include <ButtonConstants.au3> #include <Date.au3> #include <FileConstants.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <StaticConstants.au3> +#include <StringConstants.au3> #include <TrayCox.au3> ; source: https://github.com/SimpelMe/TrayCox - not needed for functionality FileDelete(@TempDir & '\output.wav') FileInstall('K:\ffmpeg\bin\ffmpeg.exe', @TempDir & "\ffmpeg.exe", $FC_OVERWRITE) Local $sPathFFmpeg = @TempDir & "\" +FileInstall('K:\ffmpeg\bin\ffprobe.exe', @TempDir & "\ffprobe.exe", $FC_OVERWRITE) +Local $sPathFFprobe = @TempDir & "\" Global $g_sStdErrAll -Local $bSendTo = False -Local $sFile -;~ Local $sFile = "T:\Maus\VPN\AUDIO~4T~\zelckc\Test.mxf" -;~ Local $sFile = "M:\Ue_Schnitt_Ton\ton_fertig\G59031_005_Film-Tip-Wie-vi_E_190612_DAS18_M02_B.mxf" -;~ Local $sFile = "M:\Ue_Schnitt_Ton\ton_fertig\G55969_002_Die-wunderbare-_S_190610_E1440_MS1_B.mxf" +; Testfiles +;~ Local $sFile = "M:\MFT\MFT-OUT\43051753.mp4" ; 4x Stereo +;~ Local $sFile = "M:\MFT\MFT-OUT\43051753_Logo.mp4" ; 2x Stereo +;~ Local $sFile = "T:\Maus\VPN\AUDIO~4T~\zelckc\A10829_081_Test-TNB-------_E_160926_TESTX_SVT_B.mxf" ; 8x Mono +;~ Local $sFile = "T:\Maus\VPN\AUDIO~4T~\zelckc\M83_We_own_the_sky.wav" ; 1x Stereo +;~ Local $sFile = "T:\Maus\VPN\AUDIO~4T~\seidemann_social\ES_Backstabbers Waltz - Etienne Roussel.mp3" +;~ Local $sFile = "T:\Maus\VPN\AUDIO~4T~\Gitta\SoundFX\Short Skid Whoosh - kurz.aif" +;~ Local $sFile = "T:\Maus\VPN\AUDIO~4T~\zelckc\A10829_ohne-Ton.mxf" ; NO AUDIO +Local $sFile If FileExists($cmdlineraw) Then $sFile = $cmdlineraw - $bSendTo = True Else $sFile = FileOpenDialog("Choose a file", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "Alle (*.*)", $FD_FILEMUSTEXIST) If @error Then - MsgBox($MB_TOPMOST, "Error", "File selection failed" & @CRLF & @CRLF & "Program exits.") + MsgBox($MB_TOPMOST, "Error", "File selection failed." & @CRLF & @CRLF & "Application exits.") Exit EndIf EndIf +; how many video streams to increase stream counter +Local $sCommand = '-i "' & $sFile & '" -v 0 -show_entries stream=codec_type -of default=nw=1:nk=1' +Local $sCodecs = _runFFprobe('ffprobe ' & $sCommand, $sPathFFprobe) +ConsoleWrite("Codecs: " & $sCodecs & @CRLF) +StringReplace($sCodecs, "video", "video") ; just to get the count +Local $iCounterVideo = Number(@extended) +ConsoleWrite("Counter video: " & $iCounterVideo & @CRLF) + +; is audio inside? +StringReplace($sCodecs, "audio", "audio") ; just to get the count +If @extended = 0 Then + MsgBox($MB_TOPMOST, "Error", "No audio channels found.") + Exit +EndIf + +; channel layout for all audio streams +$sCommand = '-i "' & $sFile & '" -v 0 -select_streams a -show_entries stream=channels -of default=nw=1:nk=1' +Local $sChannels = _runFFprobe('ffprobe ' & $sCommand, $sPathFFprobe) +Local $aChannels = StringSplit($sChannels, @CRLF, $STR_ENTIRESPLIT) +If Not IsArray($aChannels) Then + MsgBox($MB_TOPMOST, "Error", "No audio channels found.") + Exit +EndIf +For $i = 0 To $aChannels[0] + $aChannels[$i] = Number($aChannels[$i]) +Next +ConsoleWrite("Streams: " & $aChannels[0] & @CRLF) +For $i = 1 To $aChannels[0] + ConsoleWrite("Channels: " & $aChannels[$i] & @CRLF) +Next + +; are all streams mono or stereo +Local Enum $eMONO = 1, $eSTEREO +Local $iMonoCount = 0, $iStereoCount = 0 +Local $iLayout = 0 +StringReplace($sChannels, "1", "1") ; just to get the count +If @extended > 0 Then + $iMonoCount = @extended + If $iMonoCount = $aChannels[0] Then + $iLayout = $eMONO + EndIf + ConsoleWrite("Monofiles: " & @extended & @CRLF) +EndIf +StringReplace($sChannels, "2", "2") ; just to get the count +If @extended > 0 Then + $iStereoCount = @extended + If $iStereoCount = $aChannels[0] Then + $iLayout = $eSTEREO + EndIf + ConsoleWrite("Stereofiles: " & @extended & @CRLF) +EndIf +Local $iMeasuringPairs = 0 +Switch $iLayout + Case $eMONO + $iMeasuringPairs = $iMonoCount / 2 + ConsoleWrite("All MONO" & @CRLF) + Case $eSTEREO + $iMeasuringPairs = $iStereoCount + ConsoleWrite("All STEREO" & @CRLF) + Case Else + ConsoleWrite("UNDEFINED Layout" & @CRLF) + MsgBox($MB_TOPMOST, "Error", "Track layout is undefined." & @CRLF & "Application exits.") + Exit +EndSwitch +ConsoleWrite("Pairs for measuring: " & $iMeasuringPairs & @CRLF) +Local $bShowTrackSelection = True +If $iMeasuringPairs = 1 Then $bShowTrackSelection = False ; then there is no choice of tracks + Local $iTrackL = 1 Local $iTrackR = 2 -If Not $bSendTo Then +If $bShowTrackSelection Then GUICreate("Tracks", 300, 50) Local $idTracks12 = GUICtrlCreateRadio("1+2", 10, 10, 50, 30) GUICtrlSetState(-1, $GUI_CHECKED) Local $idTracks34 = GUICtrlCreateRadio("3+4", 60, 10, 50, 30) Local $idTracks56 = GUICtrlCreateRadio("5+6", 110, 10, 50, 30) Local $idTracks78 = GUICtrlCreateRadio("7+8", 160, 10, 50, 30) + If $iMeasuringPairs < 3 Then + GUICtrlSetState($idTracks56, $GUI_HIDE) + GUICtrlSetState($idTracks78, $GUI_HIDE) + ElseIf $iMeasuringPairs < 4 Then + GUICtrlSetState($idTracks78, $GUI_HIDE) + EndIf Local $idButtonOK = GUICtrlCreateButton("OK", 210, 10, 80, 30, $BS_DEFPUSHBUTTON) GUISetState(@SW_SHOW) @@ -101,7 +182,13 @@ GUISetState(@SW_SHOW) Global $hTimerStart = TimerInit() -Local $sCommand = '-i "' & $sFile & '" -filter_complex "[0:' & $iTrackL & '][0:' & $iTrackR & '] amerge" -c:a pcm_s24le -y ' & @TempDir & '\output.wav' +Switch $iLayout + Case $eMONO + $sCommand = '-i "' & $sFile & '" -filter_complex "[0:' & $iTrackL - 1 + $iCounterVideo & '][0:' & $iTrackR - 1 + $iCounterVideo & '] amerge" -c:a pcm_s24le -y ' & @TempDir & '\output.wav' + Case $eSTEREO + $sCommand = '-i "' & $sFile & '" -map 0:' & $iTrackR / 2 - 1 + $iCounterVideo & ' -c:a pcm_s24le -y ' & @TempDir & '\output.wav' +EndSwitch + _runFFmpeg('ffmpeg ' & $sCommand, $sPathFFmpeg, 1) GUICtrlSetData($Progress1, 100) ; if ffmpeg is done than set progress to 100 - sometimes last StderrRead with 100 is missed @@ -127,7 +214,7 @@ While 1 WEnd Exit -Func _runFFmpeg($command , $wd, $iProgress) +Func _runFFmpeg($command, $wd, $iProgress) Local $hPid = Run('"' & @ComSpec & '" /c ' & $command, $wd, @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD) Local $sStdErr, $sTimer Local $iTicksDuration = 0, $iTicksTime = 0, $iTimer @@ -135,6 +222,7 @@ Func _runFFmpeg($command , $wd, $iProgress) Sleep(500) $sStdErr = StderrRead($hPid) If @error Then ExitLoop +;~ ConsoleWrite("FFmpeg: " & $sStdErr & @CRLF) $g_sStdErrAll &= $sStdErr If StringLen($sStdErr) > 0 Then If Not $iTicksDuration Then $iTicksDuration = _GetDuration($sStdErr) @@ -155,6 +243,20 @@ Func _runFFmpeg($command , $wd, $iProgress) WEnd EndFunc +Func _runFFprobe($command, $wd) + Local $sStdErrAll + Local $sStdErr + Local $hPid = Run('"' & @ComSpec & '" /c ' & $command, $wd, @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD) + While 1 + Sleep(50) + $sStdErr = StdoutRead($hPid) + If @error Then ExitLoop + $sStdErrAll &= $sStdErr + WEnd + $sStdErrAll = StringRegExpReplace($sStdErrAll, "\R$", "") ; delete last new line sequence + Return $sStdErrAll +EndFunc + Func _GetDuration($sStdErr) If Not StringInStr($sStdErr, "Duration:") Then Return SetError(1, 0, 0) Local $aRegExp = StringRegExp($sStdErr, "(?i)Duration.+?([0-9:]+)", 3)