Social Media logo EST Login Sign Up Crypto News Not Logged In
Login

 

 

 

 

 

mitch

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

No video exists.

0Enjoy
 

Comments


Today: 0

Total: 734482

Last Hour: 0