FFmpeg - 使用基于持续时间的 Firequalizer 过滤器

FFmpeg - 使用基于持续时间的 Firequalizer 过滤器

我尝试在视频中使用 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

相关内容