簡體   English   中英

帶有子文件夾的ffmpeg批量重新編碼

[英]ffmpeg batch reencode with subfolders

我正在嘗試將幾百個視頻重新編碼為 X265,但有許多目錄的文件名中包含空格,某些文件也是如此。 我查看了一堆腳本,並且正在努力尋找一個適用於空間和不同目錄級別的腳本。

只要沒有子目錄,這個就可以工作:

#!/bin/bash
for i in *.avi;
do 
    ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

我一直在嘗試使用這個 bash 腳本,但它因我猜測的空格而失敗。

#!/bin/bash
inputdir=$PWD
outputdir=$PWD
while IFS= read -r file ; do
  video=`basename "$file"`
  dir=`dirname "$file"`
 ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video"
done < <(find "$inputdir" -name "*.avi" | head -100)

在這個線程上,它對於 Windows 用戶來說似乎是一個很好的解決方案,但對於 linux 來說卻不是。 FFMPEG - 批量轉換子文件夾

FOR /r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi" -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 copy "%%~dpni(2)%%~xi"

如果您能指出適合 bash 的正確解決方案,我將不勝感激。

這是findxargs的典型場景

find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh

其中-print0-0確保正確處理帶有空格的名稱。

在 convert.sh 中,您有 for 循環,幾乎與第一個腳本中的相同

#!/bin/bash

for i; do
    d=$(dirname "$i")
    b=$(basename "$i")
    ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b"
done

for i沒有任何東西意味着與“給定的所有參數”相同,它們是由 xargs 傳遞的文件。

要在文件名前面加上字符串,您必須將名稱拆分為目錄和基本部分,然后再將它們組合在一起。

使用xargs + sh -c ,但是也可以通過使使用伯恩腳本替換-I變量-在這種情況下FILE --to sh -c為在作為被用於一個位置參數$1擴展:

find . -name '*.flac' -print0 | \
xargs -0 -I FILE \
sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE

在這里,我只是用${1%.flac}去掉 .flac 擴展名並添加 m4a。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM