使用 FFmpeg 过滤器而无需视频转换

使用 FFmpeg 过滤器而无需视频转换

有人知道如何在不改变音频和视频编解码器的情况下在视频上放置图像蒙版吗?

我正在制作不同的媒体文件用于测试目的,并且我想控制 A/V 容器中使用的音频和视频编解码器,现在我需要在 A/V 文件上放置图像蒙版,而无需更改音频和视频编解码器。

当使用ffmpeg -i video.avi -i image.png -filter_complex 'overlay' avi.mkv我可以添加-acodec copy但不能时-vcodec copy,会出现错误:

请求输出流 0:0 的流复制,该流由复杂的过滤器图提供。过滤和流复制不能一起使用。

当仅使用上述命令时,FFmpeg 会将我的流编码为另一种格式(MPEG-4 和 MP3)

答案1

您自己回答了这个问题:过滤器与 不兼容copy。您在那里使用的是视频过滤器,因此您无法使用-vcodec copy-c:v copy;如果您使用的是音频过滤器,则无法使用-acodec copy-c:a copy

copy顾名思义,它会准确复制指定的流,不会进行任何更改。过滤器会更改其目标流。根据定义,copy和过滤器是不兼容的。

如果你只是想选择一个特定的视频编解码器,那么这很简单:使用-c:v [codecname];你可以看到你的 ffmpeg 支持的所有编解码器的列表

ffmpeg -codecs

答案2

由于这是为了测试,只需设置一个接近原始质量的编解码器,甚至设置一个后处理格式,如dnxhd

# Convert with near original quality compression
ffmpeg -i video.avi -i image.png -filter_complex 'overlay' -vcodec libx265 -crf 10 output.avi

我们使用 libx265,因为它可以生成非常高质量的视频,并且可用性很高。较低的 CRF 可生成最佳结果,其中 10 接近原始视频。

答案3

如果它对任何人有帮助,应该注意,通过组合ffprobeffmpeg使用 bash 可能有点丑陋的方式来做你想做的事情。如果你已经ffmpeg安装了,你很可能ffprobe也安装了。作为一个简单的纯音频示例,下面的方法对我有用,尽管原则上应该可以通过多种不同类型的流来实现类似的效果。

ffmpeg -i neil_young_tell_me_why.wav -af aresample=resampler=soxr:precision=33:cheby=true -ar 96000 -acodec `ffprobe -v error -show_entries:a:0 stream=codec_name -of default=noprint_wrappers=1:nokey=1 neil_young_tell_me_why.wav | xargs echo -n` neil_young_tell_me_why_96Kup.wav

解释:反引号内的命令输出ffprobe被就地扩展为输入文件的音频编解码器的流 0,并用 删除换行符xargsffprobe已设置为输出最少量的文本,并且 的ffprobe默认“编写器”的输出已配置为在写入屏幕时删除所有其他无关文本,例如标签等。

我想用SoX重采样器测试更高质量的重采样,所以我将一个 wav 文件从 44.1KHz 上采样到 96KHz,同时保持相同的编解码器。如果不这样做,自动选择的编解码器的ffmpeg位深度会较低,导致分辨率从 24 位降至 16 位。这样就不会损失精度。

相关内容