捐血一袋救人一命

2020年12月2日 星期三

使用PowerShell 呼叫 ffmpeg,將串流影片合併起來,並轉換成 MP4 格式

 串流影片,就是將原始影片切分成多個小影片 *.ts,然後將多個小影片寫在一個清單檔案 *.m3u8檔案

 

當你辛苦下載了每個 .ts 影片,想要合併所有檔案,以便管理,可以使用ffmpeg來處理。

合併所有 .ts 檔案之後,要再轉換成普遍的mp4格式,也還是使用ffmpeg 來處理。

 

紅字部分,請自行評估環境修改

# 要讓產生的字串帶有雙引號括起來,是因為路徑有可能包含空白

# 如果不用雙引號括起來,後面程式會發生錯誤

$ffmpeg = """C:\Users\User\Desktop\ffmpeg-4.1.4-win64-static\bin\ffmpeg.exe"""

# 目錄不要用中文,ffmpeg 會不認得

$Root = "D:\[tts 影片存放的目錄路徑]"

If(Test-Path -Path "$Root\list.txt"){

    Remove-Item -Path "$Root\list.txt"

}

# 輸出檔案格式一定要是 utf8 (with no BOM),不然 ffmpeg 會找不到檔案

Get-ChildItem -Path $Root -Filter *.ts | Sort-Object -Property Name | ForEach{

    "file '$Root\$_'" | Out-File -FilePath "$Root\list.txt" -Append -Encoding oem

}

Write-Host "Combine Files.... Please Wait"

# 如果有設定路徑,就需要加 -safe 0 參數

$CombineArgu = "-f concat -safe 0 -i ""{0}\list.txt"" -c copy ""{0}\Combine.ts""" -f $Root

Write-Host "$ffmpeg $CombineArgu" -ForegroundColor Red

Start-Process -FilePath $ffmpeg -ArgumentList $CombineArgu -Wait -WindowStyle Normal -WorkingDirectory $Root

 

Write-Host "Convert Files.... Please Wait"

$ConvertArgu = "-i ""{0}\Combine.ts"" -acodec copy -vcodec copy ""{0}\Combine.mp4""" -f $Root

Write-Host "$ffmpeg $ConvertArgu" -ForegroundColor Red

Start-Process -FilePath $ffmpeg -ArgumentList $ConvertArgu -Wait -WindowStyle Hidden -WorkingDirectory $Root

 

0 意見: