2017-10-28 66 views
0

我有一個批處理文件,處理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循環?

+0

關於1),正如你已經認識到的,批處理是麻煩的字符串解析屁股加ffprobe輸出是很難解析。我推薦mediainfo作爲替代,就像這裏提到的https:// stackoverflow。com/questions/32344947/ffmpeg-batch-extracting-media-duration-and-writing-to-a-text-file – Harry

+0

這是一個想法。我使用MediaInfo CLI進行其他操作。我沒有想到這一點。 – gregm

回答

0
for /f "tokens=1,2,3,4 delims= " %%a in (
'ffprobe -v quiet -show_entries stream=index,codec_name,height -of csv "%%a" 2^>^&1 ^| findstr "hevc"' 
) do set codec=%%b&set fheight=%%d 

應該執行你的for語句中指定的ffprobe命令。

有可能,也需要被脫字符^轉義。

插入符會轉義重定向符,以便它們被接受爲要執行的命令的一部分,而不是for本身。

要執行的命令,它括在'single quotes'

考慮你的建議的輸出,我可以看到沒有辦法,它會通過findstr過濾得到hevc,因爲它不含有hevc。此外,輸出喲提的是逗號分隔,所以delims選項應該是空間

請參閱從提示for /?的文件 - 和成千上萬的例子在這裏對SO。

+0

我需要稍微玩一下,但它看起來應該起作用。 findstr位來自我現在正在做的事情,即ffmpeg在沒有找到hevc的情況下進行處理。如果它有效,我將不需要使用這種方法。 – gregm

+0

'findstr'上的'/ v'開關顛倒了目標字符串未找到的位置。 – Magoo

+0

這是我得到的,但由於某些原因變量沒有被設置。當我運行以下所有我得到的是「狗」的輸出,這是我應該得到的,如果變量未設置/空: '爲%% a在(「*。*」)做( \t/f「tokens = * delims =,」%% a in('ffprobe -v quiet -select_streams v:0 -show_entries stream^= index ^,codec_name ^,height -of csv「%% a」2 ^> ^&1 「)不設置編解碼器= %% C&fheight設定= %% d \t如果/ I 「%編解碼%」 == 「」( \t \t回波狗 \t)否則( \t \t回聲金魚 \t) ) ' – gregm