我正在嘗試制作一個 CMD 腳本
- 創建一個文本檔案,其中列出檔案名,后跟視頻編解碼器(使用 ffprobe)
- 從串列中創建一個新文本,以便從串列中洗掉任何具有 x265 編解碼器的檔案(并格式化為
file "*filepath*" - 在編輯后的串列上運行 ffmpeg 將剩余檔案轉碼為 x265。
我有一個執行 #1 的腳本
for /R %%f IN (*.mkv,*.avi,*.mp4,*.m2ts,*.mts,*.rm,*.m4v) do echo "%%f" >>Probe.txt & ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat -select_streams v:0 -show_entries stream=codec_name "%%f" >>Probe.txt & echo. >>Probe.txt
哪個輸出
“檔案路徑” streams.stream.0.codec_name
=" codec "“檔案路徑” streams.stream.0.codec_name
=" codec "
我有一個腳本可以做#3
for /R %%f IN (*.mkv,*.avi,*.mp4,*.m2ts,*.mts,*.rm,*.m4v) do ffmpeg -hide_banner -hwaccel_output_format qsv -i "%%f" -c:v libx265 -c:a ac3 -x265-params crf=25 "%%f.mkv"
我不確定#2是否可能。
任務 2 的最終結果應該是在 probe.txt 中,任何具有
streams.stream.0.codec_name除此之外的任何值的hevc行都會將其正上方的行寫入一個新的 txt 檔案,前面是 word 檔案。
最終目標是讓所有三個任務在一個批處理檔案下運行(每個任務按順序運行)
對于我缺少什么能夠統一這些并讓#2發生有什么幫助嗎
uj5u.com熱心網友回復:
@ECHO OFF
SETLOCAL
for /R %%f IN (*.mkv,*.avi,*.mp4,*.m2ts,*.mts,*.rm,*.m4v) do (
ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat -select_streams v:0 -show_entries stream=codec_name "%%f"|FIND "streams.stream.0.codec_name"|FIND "x265">NUL
IF ERRORLEVEL 1 ffmpeg -hide_banner -hwaccel_output_format qsv -i "%%f" -c:v libx265 -c:a ac3 -x265-params crf=25 "%%f.mkv"
)
GOTO :EOF
完全未經測驗
我假設你的命令是正確的。由于帖子中沒有關于如何檢測目標檔案的資訊,不熟悉目標檔案細節的回應者ffmpeg被迫做出假設。
所以 - 假設ffprobe輸出包含字串streams.stream.0.codec_name并且x265在同一行,那么級聯查找的結果errorlevel將被設定為0如果兩者都被找到,0否則將被設定為。
所以 - 僅ffmpeg當檢測到的編解碼器不是時才運行該行x265。
請注意,檔案somename.mpg會(理論上)生成somename.mpg.mkv,因此如果希望避免雙管擴展,則需要進行一些小的修改
if errorlevel 1 if /i "%%~xf"==".mkv" (ffmpgcommand1
) else ffmpgcommand2
括號的位置和存在對于關鍵字if和else是關鍵的;ffmpgcommand1是ffmpeg具有目標檔案名的命令"%%~dpnf.converted.mkv"并且ffmpgcommand2是ffmpeg具有目標檔案名的命令"%%~dpnf.mkv"
我不知道ffmpeg目標檔案名應該已經存在怎么辦。
我會重復
僅理論 - 完全未經測驗
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520293.html
