我尝试在视频中使用 Firequalizer 滤镜作为音频均衡器。我希望滤镜在视频中每分钟的前 30 秒应用,并在接下来的 30 秒禁用。在禁用的几秒内,它不会对视频产生任何影响。有什么办法吗?
我在命令行上设置了音频均衡器及其持续时间,如下所示,但它不起作用:
:enable='lt(mod(t,60),30)'
即使代码本身可以运行,但它无法与持续时间一起运行:
ffmpeg -y -i original.mp4 -af "firequalizer=gain_entry='entry(0,-23); entry(250,-1100.5); entry(1000,0); entry(4000,0); entry(16000,16)': enable='lt(mod(t,60),3)'" test.mp4
答案1
不分段就不行。
您必须将其切成段,然后将过滤器应用到奇数段,然后连接起来。
分离音频/视频,将音频提取到.wav
:
ffmpeg -i input_file.mkv -vn output_file.wav && ffmpeg -i input_file.mkv -an -c copy input_file_video.mkv
这是一个 shell 脚本:
#!/bin/bash
input_file="$1"
# Create working directory
mkdir -p temp/segments
cd temp/segments
# Use segment muxer to create 30-second segments
ffmpeg -i ../../"$input_file" -f segment -segment_time 30 -c copy "%02d_segment.wav"
# Apply filtering to odd-numbered segments and copy even-numbered segments
for file in *.wav; do
index=$(echo "$file" | grep -oE '[0-9]+')
filtered_file="$file"
if ((index % 2 == 1)); then
ffmpeg -i "$file" -af "firequalizer=gain_entry='entry(0,-23); entry(250,-1100.5); entry(1000,0); entry(4000,0); entry(16000,16)'" ../"$filtered_file"
else
cp "$file" ../"$filtered_file"
fi
done
# Navigate back to the parent directory
cd ..
# Create list file for concatenation
ls --quoting-style=shell-always -1v *.wav > tmp.txt
sed 's|^|file |' tmp.txt > list.txt
# Concatenate files
ffmpeg -f concat -safe 0 -i list.txt -c copy ../final_output.wav
# Clean up temporary files
cd ..
rm -rf temp
exit 0
保存到:alternate_filter.sh
将模式更改为可执行:chmod +x alternate_filter.sh
用法:./alternate_filter.sh output_file.wav
重新压缩音频:
ffmpeg -i final_output.wav final_output.aac
将新的音频与视频混合:
ffmpeg -i input_file_video.mkv -i final_output.aac -c copy final_mux.mkv