02:50:28 pm 08/10/2023
Viewed: 12270
SOurce code for mp42hls:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <File.au3>
Global $iDuration = 0
Global $resolutions[8] = ["320x240", "640x480", "1280x720", "1920x1080", "2560x1440", "3840x2160", "5120x2880", "7680x4320"]
Global $bitrates[8] = ["200k", "400k", "800k", "1500k", "2500k", "4000k", "6000k", "10000k"]
Global $hGUI = GUICreate("MP4 to HLS and DASH Converter", 600, 600)
Global $inputLabel = GUICtrlCreateLabel("Input File:", 20, 20, 100, 20)
Global $inputEdit = GUICtrlCreateEdit("", 120, 20, 200, 20, $ES_READONLY)
Global $inputButton = GUICtrlCreateButton("Browse", 330, 20, 80, 20)
Global $outputLabel = GUICtrlCreateLabel("Output Directory:", 20, 60, 100, 20)
Global $outputEdit = GUICtrlCreateEdit("", 120, 60, 200, 20, $ES_READONLY)
Global $outputButton = GUICtrlCreateButton("Browse", 330, 60, 80, 20)
Global $resolutionLabel = GUICtrlCreateLabel("Resolutions:", 20, 100, 100, 20)
Global $resolutionCheckboxes[8]
$resolutionCheckboxes[0] = GUICtrlCreateCheckbox("320x240", 120, 100, 80, 20)
$resolutionCheckboxes[1] = GUICtrlCreateCheckbox("640x480", 220, 100, 80, 20)
$resolutionCheckboxes[2] = GUICtrlCreateCheckbox("1280x720", 320, 100, 80, 20)
$resolutionCheckboxes[3] = GUICtrlCreateCheckbox("1920x1080", 420, 100, 80, 20)
$resolutionCheckboxes[4] = GUICtrlCreateCheckbox("2560x1440", 120, 120, 80, 20)
$resolutionCheckboxes[5] = GUICtrlCreateCheckbox("3840x2160", 220, 120, 80, 20)
$resolutionCheckboxes[6] = GUICtrlCreateCheckbox("5120x2880", 320, 120, 80, 20)
$resolutionCheckboxes[7] = GUICtrlCreateCheckbox("7680x4320", 420, 120, 80, 20)
Global $formatLabel = GUICtrlCreateLabel("Formats:", 20, 160, 100, 20)
Global $hlsCheckbox = GUICtrlCreateCheckbox("HLS", 120, 160, 80, 20)
Global $dashCheckbox = GUICtrlCreateCheckbox("DASH", 220, 160, 80, 20)
GUICtrlSetState($hlsCheckbox, $GUI_CHECKED) ; Default to HLS
Global $gpuCheckbox = GUICtrlCreateCheckbox("GPU Processing", 330, 160, 100, 20)
Global $convertButton = GUICtrlCreateButton("Convert", 20, 200, 100, 30)
Global $stopButton = GUICtrlCreateButton("Stop", 130, 200, 100, 30)
Global $progressBar = GUICtrlCreateProgress(20, 240, 460, 20)
Global $currentActionLabel = GUICtrlCreateLabel("", 20, 270, 460, 20)
Global $outputEdit2 = GUICtrlCreateEdit("", 20, 300, 460, 200, BitOR($ES_MULTILINE, $ES_READONLY, $WS_VSCROLL))
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $inputButton
Local $file = FileOpenDialog("Select Input File", @DesktopDir, "MP4 Files (*.mp4)", 1)
If @error Then ContinueLoop
GUICtrlSetData($inputEdit, $file)
Case $outputButton
Local $dir = FileSelectFolder("Select Output Directory", @DesktopDir)
If @error Then ContinueLoop
GUICtrlSetData($outputEdit, $dir)
Case $convertButton
If GUICtrlRead($inputEdit) = "" Or GUICtrlRead($outputEdit) = "" Then
MsgBox(16, "Error", "Please select input file and output directory.")
ContinueLoop
EndIf
If GUICtrlRead($hlsCheckbox) = $GUI_UNCHECKED And GUICtrlRead($dashCheckbox) = $GUI_UNCHECKED Then
MsgBox(16, "Error", "Please select at least one output format (HLS or DASH).")
ContinueLoop
EndIf
; Create HLS and DASH subdirectories under the output directory
Local $outputDirHLS = GUICtrlRead($outputEdit) & "\hls"
Local $outputDirDASH = GUICtrlRead($outputEdit) & "\dash"
DirCreate($outputDirHLS)
DirCreate($outputDirDASH)
; Clear the progress bar and label
GUICtrlSetData($progressBar, 0)
GUICtrlSetData($currentActionLabel, "")
; Clear the output text box
GUICtrlSetData($outputEdit2, "")
; Disable buttons during conversion
GUICtrlSetState($convertButton, $GUI_DISABLE)
GUICtrlSetState($stopButton, $GUI_ENABLE)
GUICtrlSetState($inputButton, $GUI_DISABLE)
GUICtrlSetState($outputButton, $GUI_DISABLE)
For $i = 0 To UBound($resolutionCheckboxes) - 1
GUICtrlSetState($resolutionCheckboxes[$i], $GUI_DISABLE)
Next
; Perform conversion
_FFmpeg_Convert(GUICtrlRead($inputEdit), $outputDirHLS, $outputDirDASH)
; Enable buttons after conversion
GUICtrlSetState($convertButton, $GUI_ENABLE)
GUICtrlSetState($stopButton, $GUI_DISABLE)
GUICtrlSetState($inputButton, $GUI_ENABLE)
GUICtrlSetState($outputButton, $GUI_ENABLE)
For $i = 0 To UBound($resolutionCheckboxes) - 1
GUICtrlSetState($resolutionCheckboxes[$i], $GUI_ENABLE)
Next
Case $stopButton
If $iPID <> 0 Then
ProcessClose($iPID)
$iPID = 0
EndIf
EndSwitch
WEnd
Func _FFmpeg_Convert($inputFile, $outputDirHLS, $outputDirDASH)
Local $ffmpegCommandHLS, $ffmpegCommandDASH, $i, $totalFilesHLS = 0, $totalFilesDASH = 0
; Get video metadata including duration and FPS
_FFmpeg_GetMetadata($inputFile)
; Calculate total number of frames
Local $totalFrames = $iDuration * _FFmpeg_GetFPS($inputFile)
; Check if GPU processing is selected
Local $useGPU = GUICtrlRead($gpuCheckbox) = $GUI_CHECKED
For $i = 0 To UBound($resolutionCheckboxes) - 1
If GUICtrlRead($resolutionCheckboxes[$i]) = $GUI_CHECKED Then
Local $resolution = $resolutions[$i]
Local $bitrate = $bitrates[$i]
If GUICtrlRead($hlsCheckbox) = $GUI_CHECKED Then
$totalFilesHLS += 1
EndIf
If GUICtrlRead($dashCheckbox) = $GUI_CHECKED Then
$totalFilesDASH += 1
EndIf
EndIf
Next
Local $fileCountHLS = 0, $fileCountDASH = 0, $totalProcessedFiles = 0
For $i = 0 To UBound($resolutionCheckboxes) - 1
If GUICtrlRead($resolutionCheckboxes[$i]) = $GUI_CHECKED Then
Local $resolution = $resolutions[$i]
Local $bitrate = $bitrates[$i]
If GUICtrlRead($hlsCheckbox) = $GUI_CHECKED Then
$ffmpegCommandHLS = 'ffmpeg -i "' & $inputFile & '" -c:v ' & ($useGPU ? 'h264_nvenc' : 'libx264') & ' -c:a aac'
$ffmpegCommandHLS &= ' -vf scale=' & $resolution & ' -b:v ' & $bitrate & ' -b:a 128k'
$ffmpegCommandHLS &= ' -hls_time 10 -hls_list_size 0 -hls_segment_filename "' & $outputDirHLS & '\stream_' & $i & '_%03d.ts"'
$ffmpegCommandHLS &= ' -progress pipe:1 -f hls "' & $outputDirHLS & '\output_' & $i & '.m3u8"'
GUICtrlSetData($currentActionLabel, "Converting to HLS: " & $resolution)
$iPID = Run(@ComSpec & " /c " & $ffmpegCommandHLS, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
_FFmpeg_DisplayOutput($iPID, $totalFrames, $totalFilesHLS, $fileCountHLS)
$totalProcessedFiles += 1
GUICtrlSetData($progressBar, ($totalProcessedFiles / ($totalFilesHLS + $totalFilesDASH)) * 100)
EndIf
If GUICtrlRead($dashCheckbox) = $GUI_CHECKED Then
$ffmpegCommandDASH = 'ffmpeg -i "' & $inputFile & '" -c:v ' & ($useGPU ? 'h264_nvenc' : 'libx264') & ' -c:a aac'
$ffmpegCommandDASH &= ' -vf scale=' & $resolution & ' -b:v ' & $bitrate & ' -b:a 128k'
$ffmpegCommandDASH &= ' -init_seg_name init-stream_' & $i & '.m4s -media_seg_name chunk-stream_' & $i & '_$Number%05d$.m4s'
$ffmpegCommandDASH &= ' -f dash -seg_duration 10 -use_template 1 -use_timeline 1 -window_size 5 -extra_window_size 10 -adaptation_sets "id=0,streams=v id=1,streams=a"'
$ffmpegCommandDASH &= ' -init_seg_name "' & $outputDirDASH & '\init-stream_' & $i & '.m4s" -media_seg_name "' & $outputDirDASH & '\chunk-stream_' & $i & '_$Number%05d$.m4s"'
$ffmpegCommandDASH &= ' -progress pipe:1 "' & $outputDirDASH & '\output_' & $i & '.mpd"'
GUICtrlSetData($currentActionLabel, "Converting to DASH: " & $resolution)
$iPID = Run(@ComSpec & " /c " & $ffmpegCommandDASH, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
_FFmpeg_DisplayOutput($iPID, $totalFrames, $totalFilesDASH, $fileCountDASH)
$totalProcessedFiles += 1
GUICtrlSetData($progressBar, ($totalProcessedFiles / ($totalFilesHLS + $totalFilesDASH)) * 100)
EndIf
EndIf
Next
GUICtrlSetData($currentActionLabel, "")
GUICtrlSetData($progressBar, 100)
; Check if the master.m3u8 file exists in the HLS output directory
If Not _CreateMasterPlaylist($outputDirHLS) Then
MsgBox(16, "Error", "The master.m3u8 file was not created.")
EndIf
EndFunc
Func _FFmpeg_GetMetadata($inputFile)
Local $iPID = Run('ffmpeg -i "' & $inputFile & '"', "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
Local $sOutput = ""
While 1
$sOutput &= StdoutRead($iPID)
If @error Then ExitLoop
WEnd
$iDuration = StringRegExpReplace($sOutput, "(?s).*Duration: (\d+:\d+:\d+\.\d+).*", "$1")
EndFunc
Func _FFmpeg_GetFPS($inputFile)
Local $iPID = Run('ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate "' & $inputFile & '"', "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
Local $sFPS = StdoutRead($iPID)
Return Round(StringReplace($sFPS, "/", ""))
EndFunc
Func _FFmpeg_DisplayOutput($iPID, $totalFrames, $totalFiles, ByRef $fileCount)
While 1
Local $sOutput = StdoutRead($iPID)
If @error Then ExitLoop
; Check if the process has finished
If StringInStr($sOutput, "progress=end") Then
$fileCount += 1
ExitLoop
EndIf
; Get current frame number
Local $currentFrame = StringRegExpReplace($sOutput, "(?s).*frame=\s*(\d+).*", "$1")
; Calculate progress and update the progress bar
Local $progress = ($currentFrame / $totalFrames) * 100
GUICtrlSetData($progressBar, (($fileCount - 1) / $totalFiles * 100) + ($progress / $totalFiles))
; Display output in the text box
GUICtrlSetData($outputEdit2, $sOutput, 1)
WEnd
EndFunc
Func _CreateMasterPlaylist($outputDirHLS)
Local $masterPlaylistPath = $outputDirHLS & "\master.m3u8"
Local $hMasterPlaylist = FileOpen($masterPlaylistPath, 2)
If $hMasterPlaylist = -1 Then Return False
FileWrite($hMasterPlaylist, "#EXTM3U" & @CRLF)
For $i = 0 To UBound($resolutions) - 1
Local $resolution = $resolutions[$i]
If GUICtrlRead($resolutionCheckboxes[$i]) = $GUI_CHECKED Then
FileWrite($hMasterPlaylist, "#EXT-X-STREAM-INF:BANDWIDTH=" & $bitrates[$i] & ",RESOLUTION=" & $resolution & @CRLF)
FileWrite($hMasterPlaylist, "output_" & $i & ".m3u8" & @CRLF)
EndIf
Next
FileClose($hMasterPlaylist)
Return True
EndFunc
link to the executible (windows 64 bit)
http://www.garageaction.com/mp4tohlsdash64.zip
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <File.au3>
Global $iDuration = 0
Global $resolutions[8] = ["320x240", "640x480", "1280x720", "1920x1080", "2560x1440", "3840x2160", "5120x2880", "7680x4320"]
Global $bitrates[8] = ["200k", "400k", "800k", "1500k", "2500k", "4000k", "6000k", "10000k"]
Global $hGUI = GUICreate("MP4 to HLS and DASH Converter", 600, 600)
Global $inputLabel = GUICtrlCreateLabel("Input File:", 20, 20, 100, 20)
Global $inputEdit = GUICtrlCreateEdit("", 120, 20, 200, 20, $ES_READONLY)
Global $inputButton = GUICtrlCreateButton("Browse", 330, 20, 80, 20)
Global $outputLabel = GUICtrlCreateLabel("Output Directory:", 20, 60, 100, 20)
Global $outputEdit = GUICtrlCreateEdit("", 120, 60, 200, 20, $ES_READONLY)
Global $outputButton = GUICtrlCreateButton("Browse", 330, 60, 80, 20)
Global $resolutionLabel = GUICtrlCreateLabel("Resolutions:", 20, 100, 100, 20)
Global $resolutionCheckboxes[8]
$resolutionCheckboxes[0] = GUICtrlCreateCheckbox("320x240", 120, 100, 80, 20)
$resolutionCheckboxes[1] = GUICtrlCreateCheckbox("640x480", 220, 100, 80, 20)
$resolutionCheckboxes[2] = GUICtrlCreateCheckbox("1280x720", 320, 100, 80, 20)
$resolutionCheckboxes[3] = GUICtrlCreateCheckbox("1920x1080", 420, 100, 80, 20)
$resolutionCheckboxes[4] = GUICtrlCreateCheckbox("2560x1440", 120, 120, 80, 20)
$resolutionCheckboxes[5] = GUICtrlCreateCheckbox("3840x2160", 220, 120, 80, 20)
$resolutionCheckboxes[6] = GUICtrlCreateCheckbox("5120x2880", 320, 120, 80, 20)
$resolutionCheckboxes[7] = GUICtrlCreateCheckbox("7680x4320", 420, 120, 80, 20)
Global $formatLabel = GUICtrlCreateLabel("Formats:", 20, 160, 100, 20)
Global $hlsCheckbox = GUICtrlCreateCheckbox("HLS", 120, 160, 80, 20)
Global $dashCheckbox = GUICtrlCreateCheckbox("DASH", 220, 160, 80, 20)
GUICtrlSetState($hlsCheckbox, $GUI_CHECKED) ; Default to HLS
Global $gpuCheckbox = GUICtrlCreateCheckbox("GPU Processing", 330, 160, 100, 20)
Global $convertButton = GUICtrlCreateButton("Convert", 20, 200, 100, 30)
Global $stopButton = GUICtrlCreateButton("Stop", 130, 200, 100, 30)
Global $progressBar = GUICtrlCreateProgress(20, 240, 460, 20)
Global $currentActionLabel = GUICtrlCreateLabel("", 20, 270, 460, 20)
Global $outputEdit2 = GUICtrlCreateEdit("", 20, 300, 460, 200, BitOR($ES_MULTILINE, $ES_READONLY, $WS_VSCROLL))
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $inputButton
Local $file = FileOpenDialog("Select Input File", @DesktopDir, "MP4 Files (*.mp4)", 1)
If @error Then ContinueLoop
GUICtrlSetData($inputEdit, $file)
Case $outputButton
Local $dir = FileSelectFolder("Select Output Directory", @DesktopDir)
If @error Then ContinueLoop
GUICtrlSetData($outputEdit, $dir)
Case $convertButton
If GUICtrlRead($inputEdit) = "" Or GUICtrlRead($outputEdit) = "" Then
MsgBox(16, "Error", "Please select input file and output directory.")
ContinueLoop
EndIf
If GUICtrlRead($hlsCheckbox) = $GUI_UNCHECKED And GUICtrlRead($dashCheckbox) = $GUI_UNCHECKED Then
MsgBox(16, "Error", "Please select at least one output format (HLS or DASH).")
ContinueLoop
EndIf
; Create HLS and DASH subdirectories under the output directory
Local $outputDirHLS = GUICtrlRead($outputEdit) & "\hls"
Local $outputDirDASH = GUICtrlRead($outputEdit) & "\dash"
DirCreate($outputDirHLS)
DirCreate($outputDirDASH)
; Clear the progress bar and label
GUICtrlSetData($progressBar, 0)
GUICtrlSetData($currentActionLabel, "")
; Clear the output text box
GUICtrlSetData($outputEdit2, "")
; Disable buttons during conversion
GUICtrlSetState($convertButton, $GUI_DISABLE)
GUICtrlSetState($stopButton, $GUI_ENABLE)
GUICtrlSetState($inputButton, $GUI_DISABLE)
GUICtrlSetState($outputButton, $GUI_DISABLE)
For $i = 0 To UBound($resolutionCheckboxes) - 1
GUICtrlSetState($resolutionCheckboxes[$i], $GUI_DISABLE)
Next
; Perform conversion
_FFmpeg_Convert(GUICtrlRead($inputEdit), $outputDirHLS, $outputDirDASH)
; Enable buttons after conversion
GUICtrlSetState($convertButton, $GUI_ENABLE)
GUICtrlSetState($stopButton, $GUI_DISABLE)
GUICtrlSetState($inputButton, $GUI_ENABLE)
GUICtrlSetState($outputButton, $GUI_ENABLE)
For $i = 0 To UBound($resolutionCheckboxes) - 1
GUICtrlSetState($resolutionCheckboxes[$i], $GUI_ENABLE)
Next
Case $stopButton
If $iPID <> 0 Then
ProcessClose($iPID)
$iPID = 0
EndIf
EndSwitch
WEnd
Func _FFmpeg_Convert($inputFile, $outputDirHLS, $outputDirDASH)
Local $ffmpegCommandHLS, $ffmpegCommandDASH, $i, $totalFilesHLS = 0, $totalFilesDASH = 0
; Get video metadata including duration and FPS
_FFmpeg_GetMetadata($inputFile)
; Calculate total number of frames
Local $totalFrames = $iDuration * _FFmpeg_GetFPS($inputFile)
; Check if GPU processing is selected
Local $useGPU = GUICtrlRead($gpuCheckbox) = $GUI_CHECKED
For $i = 0 To UBound($resolutionCheckboxes) - 1
If GUICtrlRead($resolutionCheckboxes[$i]) = $GUI_CHECKED Then
Local $resolution = $resolutions[$i]
Local $bitrate = $bitrates[$i]
If GUICtrlRead($hlsCheckbox) = $GUI_CHECKED Then
$totalFilesHLS += 1
EndIf
If GUICtrlRead($dashCheckbox) = $GUI_CHECKED Then
$totalFilesDASH += 1
EndIf
EndIf
Next
Local $fileCountHLS = 0, $fileCountDASH = 0, $totalProcessedFiles = 0
For $i = 0 To UBound($resolutionCheckboxes) - 1
If GUICtrlRead($resolutionCheckboxes[$i]) = $GUI_CHECKED Then
Local $resolution = $resolutions[$i]
Local $bitrate = $bitrates[$i]
If GUICtrlRead($hlsCheckbox) = $GUI_CHECKED Then
$ffmpegCommandHLS = 'ffmpeg -i "' & $inputFile & '" -c:v ' & ($useGPU ? 'h264_nvenc' : 'libx264') & ' -c:a aac'
$ffmpegCommandHLS &= ' -vf scale=' & $resolution & ' -b:v ' & $bitrate & ' -b:a 128k'
$ffmpegCommandHLS &= ' -hls_time 10 -hls_list_size 0 -hls_segment_filename "' & $outputDirHLS & '\stream_' & $i & '_%03d.ts"'
$ffmpegCommandHLS &= ' -progress pipe:1 -f hls "' & $outputDirHLS & '\output_' & $i & '.m3u8"'
GUICtrlSetData($currentActionLabel, "Converting to HLS: " & $resolution)
$iPID = Run(@ComSpec & " /c " & $ffmpegCommandHLS, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
_FFmpeg_DisplayOutput($iPID, $totalFrames, $totalFilesHLS, $fileCountHLS)
$totalProcessedFiles += 1
GUICtrlSetData($progressBar, ($totalProcessedFiles / ($totalFilesHLS + $totalFilesDASH)) * 100)
EndIf
If GUICtrlRead($dashCheckbox) = $GUI_CHECKED Then
$ffmpegCommandDASH = 'ffmpeg -i "' & $inputFile & '" -c:v ' & ($useGPU ? 'h264_nvenc' : 'libx264') & ' -c:a aac'
$ffmpegCommandDASH &= ' -vf scale=' & $resolution & ' -b:v ' & $bitrate & ' -b:a 128k'
$ffmpegCommandDASH &= ' -init_seg_name init-stream_' & $i & '.m4s -media_seg_name chunk-stream_' & $i & '_$Number%05d$.m4s'
$ffmpegCommandDASH &= ' -f dash -seg_duration 10 -use_template 1 -use_timeline 1 -window_size 5 -extra_window_size 10 -adaptation_sets "id=0,streams=v id=1,streams=a"'
$ffmpegCommandDASH &= ' -init_seg_name "' & $outputDirDASH & '\init-stream_' & $i & '.m4s" -media_seg_name "' & $outputDirDASH & '\chunk-stream_' & $i & '_$Number%05d$.m4s"'
$ffmpegCommandDASH &= ' -progress pipe:1 "' & $outputDirDASH & '\output_' & $i & '.mpd"'
GUICtrlSetData($currentActionLabel, "Converting to DASH: " & $resolution)
$iPID = Run(@ComSpec & " /c " & $ffmpegCommandDASH, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
_FFmpeg_DisplayOutput($iPID, $totalFrames, $totalFilesDASH, $fileCountDASH)
$totalProcessedFiles += 1
GUICtrlSetData($progressBar, ($totalProcessedFiles / ($totalFilesHLS + $totalFilesDASH)) * 100)
EndIf
EndIf
Next
GUICtrlSetData($currentActionLabel, "")
GUICtrlSetData($progressBar, 100)
; Check if the master.m3u8 file exists in the HLS output directory
If Not _CreateMasterPlaylist($outputDirHLS) Then
MsgBox(16, "Error", "The master.m3u8 file was not created.")
EndIf
EndFunc
Func _FFmpeg_GetMetadata($inputFile)
Local $iPID = Run('ffmpeg -i "' & $inputFile & '"', "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
Local $sOutput = ""
While 1
$sOutput &= StdoutRead($iPID)
If @error Then ExitLoop
WEnd
$iDuration = StringRegExpReplace($sOutput, "(?s).*Duration: (\d+:\d+:\d+\.\d+).*", "$1")
EndFunc
Func _FFmpeg_GetFPS($inputFile)
Local $iPID = Run('ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate "' & $inputFile & '"', "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
Local $sFPS = StdoutRead($iPID)
Return Round(StringReplace($sFPS, "/", ""))
EndFunc
Func _FFmpeg_DisplayOutput($iPID, $totalFrames, $totalFiles, ByRef $fileCount)
While 1
Local $sOutput = StdoutRead($iPID)
If @error Then ExitLoop
; Check if the process has finished
If StringInStr($sOutput, "progress=end") Then
$fileCount += 1
ExitLoop
EndIf
; Get current frame number
Local $currentFrame = StringRegExpReplace($sOutput, "(?s).*frame=\s*(\d+).*", "$1")
; Calculate progress and update the progress bar
Local $progress = ($currentFrame / $totalFrames) * 100
GUICtrlSetData($progressBar, (($fileCount - 1) / $totalFiles * 100) + ($progress / $totalFiles))
; Display output in the text box
GUICtrlSetData($outputEdit2, $sOutput, 1)
WEnd
EndFunc
Func _CreateMasterPlaylist($outputDirHLS)
Local $masterPlaylistPath = $outputDirHLS & "\master.m3u8"
Local $hMasterPlaylist = FileOpen($masterPlaylistPath, 2)
If $hMasterPlaylist = -1 Then Return False
FileWrite($hMasterPlaylist, "#EXTM3U" & @CRLF)
For $i = 0 To UBound($resolutions) - 1
Local $resolution = $resolutions[$i]
If GUICtrlRead($resolutionCheckboxes[$i]) = $GUI_CHECKED Then
FileWrite($hMasterPlaylist, "#EXT-X-STREAM-INF:BANDWIDTH=" & $bitrates[$i] & ",RESOLUTION=" & $resolution & @CRLF)
FileWrite($hMasterPlaylist, "output_" & $i & ".m3u8" & @CRLF)
EndIf
Next
FileClose($hMasterPlaylist)
Return True
EndFunc
link to the executible (windows 64 bit)
http://www.garageaction.com/mp4tohlsdash64.zip
No video exists.
Comments