我有一個批處理文件,處理ffprobe查詢的輸出。它檢索我用來確定一些ffmpeg指令的幾位數據。特別是我將h264視頻轉換爲h265,如果視頻幀高度爲720或更高。我也將音頻流轉換爲aac,如果它不是已經存在,並且如果該流高於128 kbps我將其轉換爲128.如何從標準輸出設置逗號分隔值?
我可以通過調用ffprobe多次來完成所有操作,並使用if語句來決定我的ffmpeg命令是什麼。
我希望我的批處理文件更高效,所以我一直在想,如果我可以輸出一個(也許是兩個)ffprobe查詢,然後將該輸出粘貼到for/f標記= ....循環,然後我可以將每個ffprobe數據點設置爲一個變量,然後檢查變量以決定生成的ffmpeg命令的結果。
下面是我現在只是檢查視頻流是否是hevc。如果不是,則ffmpeg將視頻轉換爲hevc並將音頻複製到aac。
for %%a in ("*.*") do (
ffprobe -v quiet -show_entries stream=index,codec_name,height -of csv "%%a" 2>&1 | findstr "hevc"
if errorlevel 1 (
ffmpeg.exe -hwaccel cuvid -i "%%a" -pix_fmt p010le -c:v hevc_nvenc -preset slow -rc vbr_hq -b:v 4M -maxrate:v 10M -c:a aac "%%~na.h265-convert.mp4"
))
這ffprobe查詢輸出如下:
stream,0,h264,480
我在想,如果我可以記號化是輸出的東西,如:
for /f "tokens=1,2,3,4 delims= " %%a in ("______") do set codec=%%b&set fheight=%%d
我不知道放什麼在我有_______的地方。我真的不想創建一個臨時文件,除非這是唯一的選擇。
1)這是一種有效的方式來實現我想要做的事情嗎?
2)我在什麼地方使用了上面的空行________來調用ffprobe查詢的輸出以用於我的for循環?
關於1),正如你已經認識到的,批處理是麻煩的字符串解析屁股加ffprobe輸出是很難解析。我推薦mediainfo作爲替代,就像這裏提到的https:// stackoverflow。com/questions/32344947/ffmpeg-batch-extracting-media-duration-and-writing-to-a-text-file – Harry
這是一個想法。我使用MediaInfo CLI進行其他操作。我沒有想到這一點。 – gregm