8.0发布!ffmpeg使用场景和指令

举报
码乐 发表于 2025/09/07 08:32:59 2025/09/07
【摘要】 1 简介FFmpeg是一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频,是一个功能强大但不可见的开源媒体引擎,可以处理 Linux 及其他版本上的大多数视频任务——本周末,开发人员推出了一项重大更新。亮点是 FFmpeg 8.0 添加了基于 Vulkan 计算的编解码器。这些通过利用“适用于 Vulkan 1.3 的任何实现”的计算着色器,为视频解码和编码提供了基于硬件的加速器...

1 简介

FFmpeg是一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频,是一个功能强大但不可见的开源媒体引擎,可以处理 Linux 及其他版本上的大多数视频任务——本周末,开发人员推出了一项重大更新。

亮点是 FFmpeg 8.0 添加了基于 Vulkan 计算的编解码器。这些通过利用“适用于 Vulkan 1.3 的任何实现”的计算着色器,为视频解码和编码提供了基于硬件的加速器的替代方案。

Vulkan 计算编解码器提供了硬件解码和编码加速器的替代方案

现代 GPU(分立和集成)具有用于常见格式(“加速器”)的专用硬件媒体解码/编码器。FFmpeg 8.0 的 Vulkan 方法使用通用计算核心(通过着色器)来处理视频处理。

该功能不打算处理主流编解码器(因为这些编解码器可以很好地满足 GPU 上的加速器的需求),但支持专为并行处理而设计的密集型编解码器,并且可以在任何兼容 Vulkan 的 GPU 上运行。

FFmpeg 8.0 使用 Vulkan 提供 FFv1(编码和解码)和 ProRes RAW(仅解码)。下一个小更新将添加 ProRes(编码和解码)和 VC-2(编码和解码)。

本文小结ffmpeg常见的使用指令。

2 ffmpeg常用指令

不重新编码提取音频

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac

-vn 是没有视频。
-acodec copy 说使用已经在那里的相同音频流。

ffmpeg.exe -i in.mp4 -vn -c:a copy out.m4a

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

使用-q:a 0可变比特率,并且指定-map a排除视频/字幕并仅抓取音频是一种很好的做法

从视频中提取一部分音频,请使用-ss指定开始时间戳的-t选项,以及指定编码持续时间的选项,例如从 3 分 5 秒开始,持续 45 秒

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3

时间戳需要采用 HH:MM:SS.xxx 格式或以秒为单位。

如果您不指定-t选项,它将结束。

如果要指定范围,例如 45 秒,则可以使用-to选项而不是-t选项:00:03:05 + 45 = 00:03:50

提取所有音轨/流

ffmpeg -i input.mov -map 0:a -c copy output.mov

-map 0:a仅选择所有音频流。视频和字幕将被排除在外。
-c copy启用流复制模式。这会复制音频并且不会对其重新编码。-c copy如果要重新编码音频,请删除。
选择支持您的音频格式的输出格式。请参阅容器格式的比较。

提取特定的音轨/流

ffmpeg -i input.mkv -map 0:a:3 -c copy output.m4a

-map 0:a:3仅选择音频流 #4(ffmpeg从 0 开始计数)。
-c copy启用流复制模式。这会复制音频并且不会对其重新编码。-c copy如果要重新编码音频,请删除。
选择支持您的音频格式的输出格式

提取和重新编码音频/更改格式没有-c copy. 各种例子:

ffmpeg -i input.mp4 -map 0:a output.mp3
ffmpeg -i input.mkv -map 0:a output.m4a
ffmpeg -i input.avi -map 0:a -c:a aac output.mka
ffmpeg -i input.mp4 output.wav

单独提取所有音频流 输入有 4 个音频流。每个音频流将作为单个单独的文件输出

ffmpeg -i input.mov -map 0:a:0 output0.wav -map 0:a:1 output1.wav -map 0:a:2 output2.wav -map 0:a:3 output3.wav

提取某个频道 使用通道分离过滤器

ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav

channel_layout是输入的通道布局。它不会自动检测到,因此您必须提供布局名称。channels 列出要提取的频道。

请参阅ffmpeg -layouts音频通道布局名称(对于channel_layout)和通道名称(对于channels)。

过滤时无法使用流复制模式 ( -c copy),因此必须重新编码音频

将音频和缩混提取为立体声(无需重新编码):

ffmpeg.exe -i in.mp4 -vn -c:a copy -ac 2 out.m4a

-map和 和有-vn什么区别

ffmpeg具有默认的流选择行为,将为每个流类型选择 1 个流(1 个视频、1 个音频、1 个字幕、1 个数据)。

-vn是一个旧的遗留选项。它从默认流选择行为中排除视频。所以,音频,字幕和数据仍然自动选择,除非告知不要与-an,-sn或-dn。

-map更复杂,但更灵活和有用。-map禁用默认的流选择行为,并且ffmpeg只会包含您使用-map选项告诉它的内容。-map还可用于排除某些流或流类型。例如,-map 0 -map -0:v将包括除所有视频之外的所有流。

3 小结

常见错误

  • 1,无效音频流

无效的音频流。只需要一个 MP3 音频流。

MP3 仅支持 1 个音频流。该错误意味着您正在尝试将 1 个以上的音频流放入 MP3。这也可能意味着您正在尝试将非 MP3 音频放入 MP3。

  • 2,WAVE 文件只有一个流

  • 3,在流 #0 中找不到编解码器的标签,容器当前不支持编解码器

    您正在尝试将音频格式放入不支持它的输出中,例如将 PCM (WAV) 放入 MP4。
    删除-c copy,选择不同的输出格式(更改文件扩展名),或手动选择编码器(例如-c:a aac)

  • 4,无法为输出文件 #0 写入标头(编解码器参数不正确?):参数无效

    这是一个无用的通用错误。实际的、提供信息的错误应紧跟在此一般错误消息之前。

  • 参考

      	https://stackoverflow.com/questions/9913032/how-can-i-extract-audio-from-video-with-ffmpeg
    
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。