乐闻世界logo
搜索文章和话题

面试题手册

FFmpeg 常见问题有哪些?如何解决编码、格式和性能问题?

在使用 FFmpeg 进行音视频处理时,经常会遇到各种问题。本文总结了常见问题及其解决方案。编码问题视频编码失败问题:编码时出现 "Error while opening encoder" 错误解决方案:# 检查编码器是否可用ffmpeg -encoders | grep h264# 使用不同的编码器ffmpeg -i input.mp4 -c:v libx264 output.mp4ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4编码速度过慢问题:编码处理速度远低于实时速度解决方案:# 使用更快的 presetffmpeg -i input.mp4 -c:v libx264 -preset ultrafast output.mp4# 使用硬件加速ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4# 降低编码质量ffmpeg -i input.mp4 -c:v libx264 -crf 28 output.mp4音视频不同步问题:输出视频中音视频不同步解决方案:# 使用 -async 参数同步音频ffmpeg -i input.mp4 -async 1 output.mp4# 重新编码音视频ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4# 指定帧率ffmpeg -i input.mp4 -r 25 output.mp4格式问题不支持的格式问题:出现 "Unsupported codec" 错误解决方案:# 查看支持的格式ffmpeg -formats# 转换为支持的格式ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4# 使用 -c copy 复制流ffmpeg -i input.mp4 -c copy output.mkv容器格式不兼容问题:某些播放器无法播放输出文件解决方案:# 使用标准容器格式ffmpeg -i input.mp4 -c:v libx264 -c:a aac -movflags +faststart output.mp4# 生成兼容性更好的 MP4ffmpeg -i input.mp4 -c:v libx264 -profile:v baseline -level 3.0 output.mp4性能问题CPU 占用过高问题:编码时 CPU 占用率达到 100%解决方案:# 限制线程数ffmpeg -i input.mp4 -threads 4 -c:v libx264 output.mp4# 使用硬件加速ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4# 降低编码复杂度ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -tune fastdecode output.mp4内存占用过高问题:处理大文件时内存占用过高解决方案:# 使用流式处理ffmpeg -i input.mp4 -c:v libx264 -f null -# 减少缓冲区大小ffmpeg -i input.mp4 -c:v libx264 -bufsize 1M output.mp4# 分段处理ffmpeg -i input.mp4 -c copy -f segment -segment_time 300 segment_%03d.mp4流媒体问题RTMP 推流失败问题:推流到 RTMP 服务器失败解决方案:# 检查网络连接ping rtmp.server.com# 使用正确的推流地址ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream_key# 添加超时参数ffmpeg -re -i input.mp4 -timeout 5000000 -c copy -f flv rtmp://server/live/stream_keyHLS 播放卡顿问题:HLS 流播放时卡顿解决方案:# 增加分片时长ffmpeg -i input.mp4 -f hls -hls_time 10 output.m3u8# 减少分片数量ffmpeg -i input.mp4 -f hls -hls_list_size 5 output.m3u8# 使用更短的 GOPffmpeg -i input.mp4 -c:v libx264 -g 25 -f hls output.m3u8滤镜问题Filter 链错误问题:使用 filter 时出现 "Invalid filterchain" 错误解决方案:# 检查 filter 语法ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4# 使用 -filter_complex 处理复杂滤镜ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1280:720[v]" -map "[v]" output.mp4# 分步处理ffmpeg -i input.mp4 -vf "scale=1280:720" -vf "crop=640:360" output.mp4Filter 性能问题问题:使用 filter 后处理速度变慢解决方案:# 使用硬件加速的 filterffmpeg -hwaccel cuda -i input.mp4 -vf "scale_npp=1280:720" output.mp4# 优化 filter 顺序ffmpeg -i input.mp4 -vf "crop=640:480,scale=320:240" output.mp4# 减少复杂 filterffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4调试技巧查看详细信息# 显示详细日志ffmpeg -v verbose -i input.mp4 output.mp4# 显示调试信息ffmpeg -v debug -i input.mp4 output.mp4# 分析输入文件ffmpeg -i input.mp4 -f null -性能分析# 显示处理时间ffmpeg -i input.mp4 -c:v libx264 -stats output.mp4# 基准测试ffmpeg -benchmark -i input.mp4 -c:v libx264 -f null -# 显示编码统计ffmpeg -i input.mp4 -c:v libx264 -pass 1 -f null /dev/null最佳实践使用正确的编码参数:根据目标平台选择合适的编码器和参数监控资源使用:使用系统监控工具观察 CPU、内存和 GPU 使用情况测试小样本:在处理大文件前先测试小样本使用硬件加速:在支持的情况下优先使用硬件编码/解码合理设置线程数:根据 CPU 核心数设置合适的线程数遇到问题时,首先查看错误信息,然后根据错误类型选择相应的解决方案。如果问题仍然存在,可以查看 FFmpeg 文档或社区寻求帮助。
阅读 0·2月18日 11:08

如何使用 FFmpeg 进行视频剪辑、合并和截图?有哪些实用技巧?

FFmpeg 提供了强大的视频剪辑和处理功能,可以精确控制视频的时间范围、片段提取和合并。视频剪辑按时间范围剪辑# 从 10 秒开始,剪辑 30 秒ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:30 -c copy output.mp4# 从 1 分 30 秒开始,剪辑到 3 分钟ffmpeg -i input.mp4 -ss 00:01:30 -to 00:03:00 -c copy output.mp4精确剪辑技巧使用 -ss 参数时,将其放在 -i 之前可以实现快速定位,但可能不够精确;放在 -i 之后则更精确但速度较慢。# 快速定位(可能不精确)ffmpeg -ss 00:00:10 -i input.mp4 -t 00:00:30 -c copy output.mp4# 精确定位(速度较慢)ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:30 -c copy output.mp4视频合并使用 concat 协议# 创建文件列表 filelist.txtfile 'part1.mp4'file 'part2.mp4'file 'part3.mp4'# 合并视频ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4使用 concat filterffmpeg -i part1.mp4 -i part2.mp4 -i part3.mp4 \ -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \ -map "[outv]" -map "[outa]" output.mp4视频截图单帧截图# 在第 5 秒截取一帧ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 screenshot.jpg# 截取第一帧ffmpeg -i input.mp4 -vframes 1 first_frame.png批量截图# 每秒截取一帧ffmpeg -i input.mp4 -vf fps=1 screenshot_%04d.jpg# 每 5 秒截取一帧ffmpeg -i input.mp4 -vf fps=1/5 screenshot_%04d.jpg视频处理调整分辨率# 缩放到 1280x720ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4# 保持宽高比缩放ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4旋转视频# 顺时针旋转 90 度ffmpeg -i input.mp4 -vf "transpose=1" output.mp4# 逆时针旋转 90 度ffmpeg -i input.mp4 -vf "transpose=2" output.mp4添加水印# 添加图片水印ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4# 添加文字水印ffmpeg -i input.mp4 -vf "drawtext=text='Watermark':fontcolor=white:fontsize=24:x=10:y=10" output.mp4音视频分离与合并提取音频# 提取音频流ffmpeg -i video.mp4 -vn -acodec copy audio.aac# 转换音频格式ffmpeg -i video.mp4 -vn -acodec libmp3lame -ab 192k audio.mp3提取视频# 提取视频流(无音频)ffmpeg -i video.mp4 -an -c:v copy video.mp4合并音视频# 将音频和视频合并ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4视频剪辑和处理时,使用 -c copy 可以避免重新编码,提高处理速度并保持原始质量。
阅读 0·2月18日 11:07

如何使用 FFmpeg 进行批量处理和自动化任务?

FFmpeg 可以通过脚本和工具实现批量处理,大大提高工作效率,适合处理大量视频文件。基本批量处理使用 Shell 脚本批量转码#!/bin/bash# 批量转码 MP4 文件for file in *.mp4; do output="output_${file}" ffmpeg -i "$file" -c:v libx264 -crf 23 -c:a aac -b:a 128k "$output"done# 批量转换格式for file in *.avi; do output="${file%.avi}.mp4" ffmpeg -i "$file" -c:v libx264 -crf 23 -c:a aac -b:a 128k "$output"done使用 find 命令批量处理# 递归处理目录中的所有视频find input_dir -name "*.mp4" -exec ffmpeg -i {} -c:v libx264 -crf 23 output_dir/{} \;# 批量提取音频find input_dir -name "*.mp4" -exec ffmpeg -i {} -vn -c:a copy output_dir/{/.}.aac \;并行处理使用 GNU Parallel# 安装 GNU Parallelbrew install parallel # macOSapt-get install parallel # Ubuntu/Debian# 并行处理 4 个文件find input_dir -name "*.mp4" | parallel -j 4 ffmpeg -i {} -c:v libx264 -crf 23 output_dir/{/.}.mp4# 显示进度find input_dir -name "*.mp4" | parallel --bar -j 4 ffmpeg -i {} -c:v libx264 -crf 23 output_dir/{/.}.mp4使用 xargs 并行处理# 并行处理 4 个文件find input_dir -name "*.mp4" | xargs -P 4 -I {} ffmpeg -i {} -c:v libx264 -crf 23 output_dir/{/.}.mp4Python 批量处理使用 subprocess 模块import subprocessimport osimport glob# 批量转码视频input_dir = "input"output_dir = "output"os.makedirs(output_dir, exist_ok=True)for input_file in glob.glob(f"{input_dir}/*.mp4"): filename = os.path.basename(input_file) output_file = os.path.join(output_dir, f"converted_{filename}") cmd = [ "ffmpeg", "-i", input_file, "-c:v", "libx264", "-crf", "23", "-c:a", "aac", "-b:a", "128k", output_file ] subprocess.run(cmd, check=True) print(f"Processed: {filename}")使用 multiprocessing 并行处理import subprocessimport osimport globfrom multiprocessing import Pooldef process_video(input_file): output_dir = "output" filename = os.path.basename(input_file) output_file = os.path.join(output_dir, f"converted_{filename}") cmd = [ "ffmpeg", "-i", input_file, "-c:v", "libx264", "-crf", "23", "-c:a", "aac", "-b:a", "128k", output_file ] subprocess.run(cmd, check=True) return filename# 并行处理input_files = glob.glob("input/*.mp4")with Pool(processes=4) as pool: results = pool.map(process_video, input_files) for result in results: print(f"Processed: {result}")PowerShell 批量处理Windows PowerShell 脚本# 批量转码视频$inputDir = "input"$outputDir = "output"New-Item -ItemType Directory -Force -Path $outputDirGet-ChildItem -Path $inputDir -Filter "*.mp4" | ForEach-Object { $inputFile = $_.FullName $outputFile = Join-Path $outputDir "converted_$($_.Name)" ffmpeg -i $inputFile -c:v libx264 -crf 23 -c:a aac -b:a 128k $outputFile Write-Host "Processed: $($_.Name)"}高级批量处理根据文件大小调整参数#!/bin/bashfor file in *.mp4; do size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file") size_mb=$((size / 1024 / 1024)) if [ $size_mb -gt 100 ]; then # 大文件使用更高的压缩率 ffmpeg -i "$file" -c:v libx264 -crf 28 -preset slow "compressed_$file" else # 小文件使用默认参数 ffmpeg -i "$file" -c:v libx264 -crf 23 -preset medium "compressed_$file" fidone根据分辨率调整参数#!/bin/bashfor file in *.mp4; do # 获取视频分辨率 resolution=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$file") if [[ $resolution == "1920x1080" ]]; then # 1080p 视频降低到 720p ffmpeg -i "$file" -vf scale=1280:720 -c:v libx264 -crf 23 "720p_$file" elif [[ $resolution == "3840x2160" ]]; then # 4K 视频降低到 1080p ffmpeg -i "$file" -vf scale=1920:1080 -c:v libx264 -crf 23 "1080p_$file" else # 其他分辨率保持不变 ffmpeg -i "$file" -c:v libx264 -crf 23 "compressed_$file" fidone批量生成缩略图#!/bin/bashfor file in *.mp4; do filename="${file%.*}" # 在 10% 处截取缩略图 ffmpeg -i "$file" -ss 00:00:05 -vframes 1 -vf scale=320:180 "${filename}_thumb.jpg" echo "Generated thumbnail for: $file"done错误处理与日志带错误处理的批量处理#!/bin/bashlog_file="processing.log"error_count=0for file in *.mp4; do echo "Processing: $file" | tee -a "$log_file" if ffmpeg -i "$file" -c:v libx264 -crf 23 "output_$file" 2>> "$log_file"; then echo "Success: $file" | tee -a "$log_file" else echo "Error: $file" | tee -a "$log_file" ((error_count++)) fidoneecho "Total errors: $error_count" | tee -a "$log_file"Python 带错误处理import subprocessimport osimport globimport logginglogging.basicConfig(filename='processing.log', level=logging.INFO)def process_video(input_file): try: output_file = f"output_{os.path.basename(input_file)}" cmd = ["ffmpeg", "-i", input_file, "-c:v", "libx264", "-crf", "23", output_file] subprocess.run(cmd, check=True, capture_output=True) logging.info(f"Success: {input_file}") return True except subprocess.CalledProcessError as e: logging.error(f"Error: {input_file} - {e.stderr.decode()}") return False# 批量处理input_files = glob.glob("*.mp4")success_count = sum(process_video(f) for f in input_files)error_count = len(input_files) - success_countlogging.info(f"Total: {len(input_files)}, Success: {success_count}, Errors: {error_count}")自动化任务定时任务(Cron)# 添加到 crontab# 每天凌晨 2 点执行批量处理0 2 * * * /path/to/batch_process.sh >> /var/log/ffmpeg_batch.log 2>&1监控目录自动处理import timeimport osfrom watchdog.observers import Observerfrom watchdog.events import FileSystemEventHandlerclass VideoHandler(FileSystemEventHandler): def on_created(self, event): if event.src_path.endswith('.mp4'): print(f"New video detected: {event.src_path}") process_video(event.src_path)def process_video(input_file): output_file = f"output_{os.path.basename(input_file)}" cmd = ["ffmpeg", "-i", input_file, "-c:v", "libx264", "-crf", "23", output_file] subprocess.run(cmd)if __name__ == "__main__": event_handler = VideoHandler() observer = Observer() observer.schedule(event_handler, path='input_dir', recursive=False) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()批量处理最佳实践使用并行处理:充分利用多核 CPU 提高处理速度添加错误处理:记录错误日志,便于排查问题监控资源使用:避免同时处理过多文件导致系统资源耗尽测试小批量:在大规模处理前先测试小批量使用进度显示:了解处理进度,便于估算完成时间备份原始文件:处理前备份重要文件批量处理可以大幅提高工作效率,但需要注意系统资源管理和错误处理。
阅读 0·2月18日 11:06

如何使用 FFmpeg 进行 RTMP 推流和 HLS/DASH 流媒体生成?

FFmpeg 是流媒体处理的重要工具,支持 RTMP、HLS、DASH 等多种流媒体协议。推流到 RTMP 服务器基本推流命令# 推送本地文件到 RTMP 服务器ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream_key# 实时编码推流ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key摄像头/麦克风实时推流# macOS 摄像头推流ffmpeg -f avfoundation -i "0" -c:v libx264 -preset veryfast -b:v 1500k -f flv rtmp://server/live/stream_key# 摄像头+麦克风推流ffmpeg -f avfoundation -i "0:0" -c:v libx264 -preset veryfast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_keyHLS 流媒体生成生成 HLS 流# 生成 HLS 播放列表ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8# 生成多码率 HLSffmpeg -i input.mp4 \ -vf scale=1920:1080 -c:v libx264 -b:v 5000k -f hls -hls_time 10 hls_1080p.m3u8 \ -vf scale=1280:720 -c:v libx264 -b:v 2500k -f hls -hls_time 10 hls_720p.m3u8 \ -vf scale=854:480 -c:v libx264 -b:v 1000k -f hls -hls_time 10 hls_480p.m3u8HLS 参数说明-hls_time:每个分片的时长(秒)-hls_list_size:播放列表中保留的分片数量(0 表示全部保留)-hls_segment_filename:分片文件命名模板-hls_flags:HLS 特殊标志(如 delete_segments、append_list)DASH 流媒体生成生成 DASH 流# 生成 DASH 清单文件ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f dash -seg_duration 10 output.mpd# 生成多码率 DASHffmpeg -i input.mp4 \ -vf scale=1920:1080 -c:v libx264 -b:v 5000k -f dash -seg_duration 10 dash_1080p.mpd \ -vf scale=1280:720 -c:v libx264 -b:v 2500k -f dash -seg_duration 10 dash_720p.mpd拉流处理从 RTMP 拉流# 拉取 RTMP 流并保存ffmpeg -i rtmp://server/live/stream -c copy output.mp4# 拉取 RTMP 流并转码ffmpeg -i rtmp://server/live/stream -c:v libx264 -preset fast -b:v 1500k -c:a aac -b:a 128k output.mp4从 HLS 拉流# 下载 HLS 流ffmpeg -i http://server/live/stream.m3u8 -c copy output.mp4# 实时播放 HLS 流ffmpeg -i http://server/live/stream.m3u8 -f null -流媒体优化延迟优化# 低延迟推流ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key# 使用 GOP 缓存ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -g 25 -keyint_min 25 -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key码率控制# CBR(恒定码率)ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 1500k -maxrate 1500k -minrate 1500k -bufsize 3000k -f flv rtmp://server/live/stream_key# VBR(可变码率)ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -crf 23 -maxrate 3000k -bufsize 6000k -f flv rtmp://server/live/stream_key常见流媒体协议| 协议 | 用途 | 特点 || ------- | ------- | ------------ || RTMP | 实时推流 | 低延迟,广泛用于直播 || HLS | HTTP 直播 | 兼容性好,支持自适应码率 || DASH | HTTP 直播 | 开放标准,跨平台支持 || RTSP | 实时流协议 | 用于监控和 IPC || UDP/RTP | 实时传输 | 低延迟,适合局域网 |流媒体处理时,需要根据网络条件、延迟要求和目标平台选择合适的协议和编码参数。
阅读 0·2月18日 11:05

如何使用 FFmpeg 获取视频信息?如何分析视频质量?

FFmpeg 提供了强大的工具来获取和分析视频文件的详细信息,这对于视频处理和质量评估非常重要。使用 ffprobe 获取视频信息基本信息查看# 查看文件基本信息ffprobe input.mp4# 显示更详细的信息ffprobe -v quiet -print_format json -show_format -show_streams input.mp4# 只显示视频流信息ffprobe -v quiet -select_streams v -show_entries stream input.mp4# 只显示音频流信息ffprobe -v quiet -select_streams a -show_entries stream input.mp4格式化输出# JSON 格式输出ffprobe -v quiet -print_format json -show_format -show_streams input.mp4# XML 格式输出ffprobe -v quiet -print_format xml -show_format -show_streams input.mp4# CSV 格式输出ffprobe -v quiet -print_format csv -show_entries stream=codec_name,width,height input.mp4# 平面文本格式ffprobe -v quiet -print_format flat -show_format -show_streams input.mp4获取特定信息视频分辨率# 获取视频分辨率ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取视频宽度ffprobe -v error -select_streams v:0 -show_entries stream=width -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取视频高度ffprobe -v error -select_streams v:0 -show_entries stream=height -of default=noprint_wrappers=1:nokey=1 input.mp4视频帧率# 获取视频帧率ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取平均帧率ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4视频时长# 获取视频时长(秒)ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取视频时长(时:分:秒)ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 input.mp4 | awk '{print int($1/3600)":"int(($1%3600)/60)":"int($1%60)}'# 获取视频时长(帧数)ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=noprint_wrappers=1:nokey=1 input.mp4视频比特率# 获取视频比特率ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取总体比特率ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4视频编码器# 获取视频编码器ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取视频编码器描述ffprobe -v error -select_streams v:0 -show_entries stream=codec_long_name -of default=noprint_wrappers=1:nokey=1 input.mp4音频信息# 获取音频采样率ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取音频声道数ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取音频编码器ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4视频质量分析PSNR(峰值信噪比)# 计算两个视频的 PSNRffmpeg -i original.mp4 -i compressed.mp4 -lavfi psnr -f null -# 显示详细的 PSNR 信息ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "psnr=stats_file=psnr.log" -f null -SSIM(结构相似性)# 计算两个视频的 SSIMffmpeg -i original.mp4 -i compressed.mp4 -lavfi ssim -f null -# 显示详细的 SSIM 信息ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "ssim=stats_file=ssim.log" -f null -VMAF(视频多方法评估融合)# 计算 VMAF 分数(需要 libvmaf)ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "libvmaf=model_path=vmaf_v0.6.1.pkl" -f null -# 生成 VMAF 报告ffmpeg -i original.mp4 -i compressed.mp4 -lavfi "libvmaf=model_path=vmaf_v0.6.1.pkl:log_path=vmaf.log" -f null -视频帧分析提取帧信息# 显示每一帧的信息ffprobe -v quiet -select_streams v:0 -show_frames input.mp4# 显示帧类型(I/P/B 帧)ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type -of default=noprint_wrappers=1:nokey=1 input.mp4# 统计帧类型ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type -of csv=p=0 input.mp4 | sort | uniq -cGOP 分析# 显示 GOP 结构ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type,pts_time input.mp4# 计算 GOP 大小ffprobe -v quiet -select_streams v:0 -show_entries frame=pict_type -of csv=p=0 input.mp4 | grep -c "^I"音频分析音频波形分析# 生成音频波形图ffmpeg -i input.mp3 -lavfi "showwavespic=s=640x320" waveform.png# 生成音频频谱图ffmpeg -i input.mp3 -lavfi showspectrumpic=s=640x320 spectrum.png# 生成音频视频ffmpeg -i input.mp3 -lavfi "showwaves=s=640x320" output.mp4音频音量分析# 分析音频音量ffmpeg -i input.mp3 -af "volumedetect" -f null -# 归一化音频ffmpeg -i input.mp3 -af "loudnorm" output.mp3文件信息分析文件大小# 获取文件大小ls -lh input.mp4# 使用 ffprobe 获取文件大小ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 input.mp4容器格式# 获取容器格式ffprobe -v error -show_entries format=format_name -of default=noprint_wrappers=1:nokey=1 input.mp4# 获取容器格式描述ffprobe -v error -show_entries format=format_long_name -of default=noprint_wrappers=1:nokey=1 input.mp4实用脚本完整视频信息脚本#!/bin/bashfile=$1echo "=== Video Information ==="echo "Resolution: $(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=noprint_wrappers=1:nokey=1 "$file")"echo "Frame Rate: $(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 "$file")"echo "Duration: $(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file") seconds"echo "Video Codec: $(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$file")"echo "Bitrate: $(ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file") bps"echo ""echo "=== Audio Information ==="echo "Audio Codec: $(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$file")"echo "Sample Rate: $(ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 "$file") Hz"echo "Channels: $(ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=noprint_wrappers=1:nokey=1 "$file")"批量分析脚本#!/bin/bashfor file in *.mp4; do echo "Analyzing: $file" duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file") resolution=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=noprint_wrappers=1:nokey=1 "$file") echo "Duration: ${duration}s, Resolution: $resolution" echo ""done最佳实践使用适当的输出格式:根据需要选择 JSON、XML 或平面文本过滤不必要的信息:使用 -select_streams 和 -show_entries 减少输出静默模式:使用 -v quiet 或 -v error 减少噪音输出批量处理:结合脚本批量分析多个文件质量评估:使用 PSNR、SSIM、VMAF 等工具评估视频质量获取和分析视频信息是视频处理的重要步骤,可以帮助你了解视频特性并选择合适的处理参数。
阅读 0·2月18日 11:03

如何使用 FFmpeg 进行视频压缩和质量优化?CRF、preset 和 tune 参数如何使用?

视频压缩是 FFmpeg 的核心功能之一,合理的压缩策略可以在保持视频质量的同时显著减小文件大小。视频压缩基础压缩原理视频压缩主要通过以下方式实现:空间压缩:减少帧内的冗余信息时间压缩:利用帧间的相似性编码优化:使用高效的编码算法常见编码格式对比| 格式 | 压缩率 | 质量 | 兼容性 | 适用场景 || ------------ | --- | -- | --- | -------- || H.264 (AVC) | 中 | 高 | 极好 | 通用视频 || H.265 (HEVC) | 高 | 高 | 良好 | 4K/8K 视频 || VP9 | 高 | 高 | 良好 | Web 视频 || AV1 | 极高 | 高 | 一般 | 新一代视频 || MPEG-4 | 低 | 中 | 好 | 旧设备 |H.264 编码参数优化CRF (Constant Rate Factor)CRF 是控制视频质量的核心参数,值越小质量越高,文件越大。# 高质量(文件较大)ffmpeg -i input.mp4 -c:v libx264 -crf 18 output.mp4# 默认质量(推荐)ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4# 中等质量ffmpeg -i input.mp4 -c:v libx264 -crf 26 output.mp4# 低质量(文件较小)ffmpeg -i input.mp4 -c:v libx264 -crf 30 output.mp4Preset 选择Preset 控制编码速度和压缩效率的平衡。# 超快速度(压缩率低)ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 output.mp4# 非常快ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -crf 23 output.mp4# 较快ffmpeg -i input.mp4 -c:v libx264 -preset faster -crf 23 output.mp4# 快ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 output.mp4# 中等(推荐)ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4# 慢(压缩率高)ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 23 output.mp4# 较慢ffmpeg -i input.mp4 -c:v libx264 -preset slower -crf 23 output.mp4# 非常慢(压缩率最高)ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 23 output.mp4Tune 参数Tune 参数针对特定类型的内容进行优化。# 电影内容ffmpeg -i input.mp4 -c:v libx264 -tune film output.mp4# 动画内容ffmpeg -i input.mp4 -c:v libx264 -tune animation output.mp4# 快速动作内容ffmpeg -i input.mp4 -c:v libx264 -tune fastdecode output.mp4# 低延迟流媒体ffmpeg -i input.mp4 -c:v libx264 -tune zerolatency output.mp4# 静态图像内容ffmpeg -i input.mp4 -c:v libx264 -tune stillimage output.mp4比特率控制CBR (Constant Bitrate)恒定比特率,适合流媒体传输。# 2Mbps CBRffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 2M -minrate 2M -bufsize 4M output.mp4# 5Mbps CBRffmpeg -i input.mp4 -c:v libx264 -b:v 5M -maxrate 5M -minrate 5M -bufsize 10M output.mp4VBR (Variable Bitrate)可变比特率,适合本地存储。# 目标 2Mbps,最大 4Mbpsffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 4M -bufsize 8M output.mp4# 使用 CRF 和最大比特率ffmpeg -i input.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M output.mp4两遍编码两遍编码可以获得更好的压缩效率。# 第一遍:分析ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -f null /dev/null# 第二遍:编码ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 output.mp4分辨率优化调整分辨率# 降低到 720pffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 23 output.mp4# 降低到 480pffmpeg -i input.mp4 -vf scale=854:480 -c:v libx264 -crf 23 output.mp4# 保持宽高比ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -crf 23 output.mp4# 按比例缩放ffmpeg -i input.mp4 -vf scale=iw*0.5:ih*0.5 -c:v libx264 -crf 23 output.mp4帧率调整# 降低到 24fpsffmpeg -i input.mp4 -r 24 -c:v libx264 -crf 23 output.mp4# 降低到 15fpsffmpeg -i input.mp4 -r 15 -c:v libx264 -crf 23 output.mp4# 保持原帧率ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4H.265 (HEVC) 编码H.265 提供比 H.264 更高的压缩效率。# H.265 编码ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4# H.265 两遍编码ffmpeg -i input.mp4 -c:v libx265 -b:v 1M -pass 1 -f null /dev/nullffmpeg -i input.mp4 -c:v libx265 -b:v 1M -pass 2 output.mp4# H.265 预设ffmpeg -i input.mp4 -c:v libx265 -preset medium -crf 28 output.mp4音频压缩音频编码优化# AAC 编码(推荐)ffmpeg -i input.mp4 -c:a aac -b:a 128k output.mp4# 高质量 AACffmpeg -i input.mp4 -c:a aac -b:a 192k output.mp4# 低质量 AACffmpeg -i input.mp4 -c:a aac -b:a 96k output.mp4# MP3 编码ffmpeg -i input.mp4 -c:a libmp3lame -b:a 128k output.mp4# Opus 编码(高质量)ffmpeg -i input.mp4 -c:a libopus -b:a 64k output.opus压缩策略建议针对不同场景的压缩参数社交媒体分享ffmpeg -i input.mp4 -c:v libx264 -crf 26 -preset medium -vf scale=1280:-1 -c:a aac -b:a 128k output.mp4网络传输ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -preset fast -c:a aac -b:a 96k output.mp4本地存储ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 192k output.mp4移动设备ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset medium -vf scale=854:480 -c:a aac -b:a 96k output.mp4压缩效果评估质量评估工具# 查看 PSNR(峰值信噪比)ffmpeg -i input.mp4 -i output.mp4 -lavfi psnr -f null -# 查看 SSIM(结构相似性)ffmpeg -i input.mp4 -i output.mp4 -lavfi ssim -f null -# 查看文件大小ls -lh input.mp4 output.mp4# 查看比特率ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 output.mp4最佳实践选择合适的 CRF 值:18-28 之间,根据质量需求调整使用合适的 preset:平衡编码时间和压缩效率调整分辨率:根据目标设备选择合适的分辨率优化音频:不要忽视音频压缩测试不同参数:找到最适合自己需求的参数组合使用两遍编码:在时间允许的情况下获得更好的压缩效果视频压缩需要在质量、文件大小和编码时间之间找到平衡,建议根据具体应用场景选择合适的压缩策略。
阅读 0·2月18日 11:03

如何使用 FFmpeg 进行屏幕录制和摄像头捕获?

FFmpeg 不仅可以处理已有的视频文件,还可以从各种设备捕获视频和音频,实现录制功能。屏幕录制macOS 屏幕录制# 录制整个屏幕ffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset ultrafast -crf 23 output.mp4# 录制指定区域ffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset ultrafast -crf 23 -vf "crop=1280:720:0:0" output.mp4# 录制屏幕和音频ffmpeg -f avfoundation -i "1:0" -r 30 -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k output.mp4Linux 屏幕录制# 使用 x11grab 录制ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 -c:v libx264 -preset ultrafast -crf 23 output.mp4# 录制指定窗口ffmpeg -f x11grab -video_size 800x600 -framerate 30 -i :0.0+100,100 -c:v libx264 -preset ultrafast -crf 23 output.mp4Windows 屏幕录制# 使用 gdigrab 录制整个屏幕ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -crf 23 output.mp4# 录制指定窗口ffmpeg -f gdigrab -framerate 30 -i title="Window Title" -c:v libx264 -preset ultrafast -crf 23 output.mp4摄像头录制macOS 摄像头录制# 列出可用设备ffmpeg -f avfoundation -list_devices true -i ""# 录制摄像头ffmpeg -f avfoundation -i "0" -r 30 -c:v libx264 -preset ultrafast -crf 23 output.mp4# 录制摄像头和麦克风ffmpeg -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k output.mp4Linux 摄像头录制# 使用 v4l2 录制ffmpeg -f v4l2 -video_size 640x480 -framerate 30 -i /dev/video0 -c:v libx264 -preset ultrafast -crf 23 output.mp4# 录制摄像头和音频ffmpeg -f v4l2 -video_size 640x480 -framerate 30 -i /dev/video0 -f alsa -i hw:0 -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k output.mp4Windows 摄像头录制# 使用 dshow 录制ffmpeg -f dshow -video_size 640x480 -framerate 30 -i video="Camera Name" -c:v libx264 -preset ultrafast -crf 23 output.mp4# 录制摄像头和麦克风ffmpeg -f dshow -video_size 640x480 -framerate 30 -i video="Camera Name" -f dshow -i audio="Microphone Name" -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k output.mp4音频录制macOS 音频录制# 录制系统音频ffmpeg -f avfoundation -i ":0" -c:a aac -b:a 128k output.aac# 录制麦克风ffmpeg -f avfoundation -i "0:0" -c:a aac -b:a 128k output.aacLinux 音频录制# 使用 alsa 录制ffmpeg -f alsa -i hw:0 -c:a aac -b:a 128k output.aac# 使用 pulseaudio 录制ffmpeg -f pulse -i default -c:a aac -b:a 128k output.aacWindows 音频录制# 使用 dshow 录制音频ffmpeg -f dshow -i audio="Microphone Name" -c:a aac -b:a 128k output.aac实时推流录制推流到 RTMP 服务器# 屏幕录制并推流ffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset ultrafast -b:v 2000k -f flv rtmp://server/live/stream_key# 摄像头录制并推流ffmpeg -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -b:v 2000k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key推流到 RTSP 服务器# 推流到 RTSPffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset ultrafast -f rtsp rtsp://server/live/stream录制参数优化降低延迟# 使用 ultrafast presetffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset ultrafast -tune zerolatency -crf 23 output.mp4# 使用硬件加速ffmpeg -f avfoundation -i "1" -r 30 -c:v h264_videotoolbox -b:v 2000k output.mp4提高质量# 使用更高质量的编码参数ffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset medium -crf 18 output.mp4# 使用更高的比特率ffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset medium -b:v 5000k output.mp4减小文件大小# 使用更高的 CRF 值ffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset medium -crf 28 output.mp4# 降低分辨率ffmpeg -f avfoundation -i "1" -r 30 -vf scale=1280:720 -c:v libx264 -preset medium -crf 23 output.mp4高级录制功能定时录制# 录制 60 秒ffmpeg -f avfoundation -i "1" -r 30 -t 60 -c:v libx264 -preset ultrafast -crf 23 output.mp4# 录制到指定时间ffmpeg -f avfoundation -i "1" -r 30 -to 00:01:00 -c:v libx264 -preset ultrafast -crf 23 output.mp4分段录制# 每 60 秒生成一个新文件ffmpeg -f avfoundation -i "1" -r 30 -c:v libx264 -preset ultrafast -crf 23 -f segment -segment_time 60 output_%03d.mp4添加水印# 录制时添加水印ffmpeg -f avfoundation -i "1" -i watermark.png -filter_complex "overlay=10:10" -r 30 -c:v libx264 -preset ultrafast -crf 23 output.mp4设备列表查询查询可用设备# macOSffmpeg -f avfoundation -list_devices true -i ""# Linuxv4l2-ctl --list-devicesffmpeg -f v4l2 -list_formats all -i /dev/video0# Windowsffmpeg -f dshow -list_devices true -i dummy录制最佳实践选择合适的 preset:实时录制使用 ultrafast 或 veryfast使用硬件加速:在支持的情况下使用硬件编码合理设置分辨率:根据网络带宽和存储空间选择监控资源使用:注意 CPU 和内存占用测试录制效果:在正式录制前进行测试录制时需要根据具体的应用场景(如直播、录播、监控等)选择合适的参数组合。
阅读 0·2月18日 11:02

如何使用 FFmpeg 进行音频处理?常用的音频滤镜有哪些?

FFmpeg 提供了强大的音频处理功能,包括音频提取、转换、混音、降噪等多种操作。音频提取与转换从视频中提取音频# 提取音频流(不重新编码)ffmpeg -i video.mp4 -vn -acodec copy audio.aac# 提取并转换为 MP3ffmpeg -i video.mp4 -vn -acodec libmp3lame -ab 192k audio.mp3# 提取并转换为 WAVffmpeg -i video.mp4 -vn audio.wav音频格式转换# MP3 转 AACffmpeg -i input.mp3 -c:a aac -b:a 128k output.aac# WAV 转 MP3ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3# FLAC 转 MP3(有损压缩)ffmpeg -i input.flac -c:a libmp3lame -b:a 320k output.mp3音频参数调整调整音量# 提升音量(2 倍)ffmpeg -i input.mp3 -af "volume=2.0" output.mp3# 降低音量(0.5 倍)ffmpeg -i input.mp3 -af "volume=0.5" output.mp3# 使用分贝调整ffmpeg -i input.mp3 -af "volume=3dB" output.mp3# 归一化音量ffmpeg -i input.mp3 -af "loudnorm" output.mp3调整采样率# 转换为 44.1kHzffmpeg -i input.wav -ar 44100 output.wav# 转换为 48kHzffmpeg -i input.wav -ar 48000 output.wav# 转换为 16kHz(语音识别常用)ffmpeg -i input.wav -ar 16000 output.wav调整声道# 转换为单声道ffmpeg -i input.mp3 -ac 1 output.mp3# 转换为立体声ffmpeg -i input.mp3 -ac 2 output.mp3# 提取左声道ffmpeg -i input.mp3 -af "pan=mono|c0=c0" output.mp3# 提取右声道ffmpeg -i input.mp3 -af "pan=mono|c0=c1" output.mp3音频剪辑按时间剪辑# 从 10 秒开始,剪辑 30 秒ffmpeg -i input.mp3 -ss 00:00:10 -t 00:00:30 output.mp3# 从 1 分钟开始,剪辑到 3 分钟ffmpeg -i input.mp3 -ss 00:01:00 -to 00:03:00 output.mp3# 剪辑前 60 秒ffmpeg -i input.mp3 -t 60 output.mp3音频拼接# 使用 concat 协议拼接echo "file 'part1.mp3'" > filelist.txtecho "file 'part2.mp3'" >> filelist.txtecho "file 'part3.mp3'" >> filelist.txtffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp3# 使用 concat filter 拼接ffmpeg -i part1.mp3 -i part2.mp3 -i part3.mp3 \ -filter_complex "[0:a][1:a][2:a]concat=n=3:v=0:a=1[outa]" \ -map "[outa]" output.mp3音频效果淡入淡出# 淡入 3 秒ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=3" output.mp3# 淡出 3 秒ffmpeg -i input.mp3 -af "afade=t=out:st=5:d=3" output.mp3# 淡入淡出ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=3,afade=t=out:st=7:d=3" output.mp3音频混音# 混合两个音频文件ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "amix=inputs=2:duration=first" output.mp3# 混合三个音频文件ffmpeg -i audio1.mp3 -i audio2.mp3 -i audio3.mp3 \ -filter_complex "amix=inputs=3:duration=longest" output.mp3# 调整混合比例ffmpeg -i audio1.mp3 -i audio2.mp3 \ -filter_complex "[0:a]volume=0.7[a0];[1:a]volume=0.3[a1];[a0][a1]amix=inputs=2" output.mp3音频延迟# 延迟音频 500 毫秒ffmpeg -i input.mp3 -af "adelay=500|500" output.mp3# 左右声道不同延迟ffmpeg -i input.mp3 -af "adelay=500|1000" output.mp3# 提前音频(负延迟)ffmpeg -i input.mp3 -af "adelay=-200|-200" output.mp3音频降噪# 使用 highpass 滤波器去除低频噪音ffmpeg -i input.mp3 -af "highpass=f=200" output.mp3# 使用 lowpass 滤波器去除高频噪音ffmpeg -i input.mp3 -af "lowpass=f=3000" output.mp3# 使用 bandpass 滤波器ffmpeg -i input.mp3 -af "bandpass=f=1000:width_type=h:width=500" output.mp3音频分析与处理音频可视化# 生成音频波形图ffmpeg -i input.mp3 -filter_complex "showwavespic=s=640x320" waveform.png# 生成频谱图ffmpeg -i input.mp3 -lavfi showspectrumpic=s=640x320 spectrum.png# 生成音频视频ffmpeg -i input.mp3 -filter_complex "showwaves=s=640x320" output.mp4音频信息查看# 查看音频详细信息ffmpeg -i input.mp3 -hide_banner# 查看音频采样率、比特率等ffprobe -i input.mp3 -show_streams -select_streams a# 分析音频音量ffmpeg -i input.mp3 -af "volumedetect" -f null -高级音频处理音频变速# 加速 1.5 倍ffmpeg -i input.mp3 -filter:a "atempo=1.5" output.mp3# 减速 0.75 倍ffmpeg -i input.mp3 -filter:a "atempo=0.75" output.mp3# 大幅变速(需要多次 atempo)ffmpeg -i input.mp3 -filter:a "atempo=2.0,atempo=2.0" output.mp3音频变调# 提高音调(半音)ffmpeg -i input.mp3 -filter:a "asetrate=44100*1.05946" output.mp3# 降低音调(半音)ffmpeg -i input.mp3 -filter:a "asetrate=44100*0.94387" output.mp4音频回声# 添加回声效果ffmpeg -i input.mp3 -af "aecho=0.8:0.9:1000:0.3" output.mp3音频编码参数常用音频编码器# AAC 编码ffmpeg -i input.wav -c:a aac -b:a 128k output.aac# MP3 编码ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3# Opus 编码(高质量)ffmpeg -i input.wav -c:a libopus -b:a 128k output.opus# FLAC 编码(无损)ffmpeg -i input.wav -c:a flac output.flac音频质量设置# 高质量 MP3 (320kbps)ffmpeg -i input.wav -c:a libmp3lame -b:a 320k output.mp3# 中等质量 MP3 (192kbps)ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3# 低质量 MP3 (128kbps)ffmpeg -i input.wav -c:a libmp3lame -b:a 128k output.mp3# VBR 编码(可变比特率)ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3音频处理时,建议使用无损格式(如 WAV、FLAC)进行中间处理,最后再转换为有损格式以减少质量损失。
阅读 0·2月18日 10:43