我有一个视频文件(时长 1 小时)。我需要将视频文件的任何部分(30 分钟)转换为音频文件
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -vcodec copy -acodec copy /opt/b.mp4
然后我用
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -acodec copy /opt/b.mp4
但我仍然可以同时观看视频和音频。我只需要音频文件
答案1
如果你只需要音频(我希望我理解正确),那么你根本不需要第一步。如果你使用:
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -vn -acodec copy /opt/b.mp3
它会做到的假如原始音频编解码器是 mp3。如果不是,您可以强制重新编码:
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -vn -acodec libmp3lame ...other_parameters.. /opt/b.mp3
将other_parameters
有比特率等。
答案2
有两种主要方法可以从包含视频或音频的文件中仅获取视频或音频。默认情况下流选择ffmpeg 中的行为将为每个流类型选择一个流。请注意,输入可以包含多种流类型:视频、音频、字幕和数据。某些输入甚至可以包含每种流类型的多个流;例如两个视频流。
-vn
或者-an
这些选项告诉 ffmpeg 省略视频(-vn
)或音频(-an
)。
要省略视频并复制音频:
ffmpeg -i input -vn -codec:a copy output.mka
要省略音频并复制视频:
ffmpeg -i input -an -codec:v copy output.mkv
这些例子将流复制所需的流。这意味着 ffmpeg 将简单地重新复用它,而不是重新编码。这非常快,而且由于它本质上是“复制和粘贴”,因此不会影响质量。
使用
-vn
和-an
不会忽略可能存在的其他流,例如字幕或数据流,但仅音频格式无论如何都会忽略这些流。
-map
这-map
选项可能看起来更复杂,但更灵活和有用。例如,-vn
告诉 ffmpeg 仅忽略视频流,但通过使用流说明符 -map
可以告诉 ffmpeg 省略除所需流之外的所有内容。
仅复制视频:
ffmpeg -i input -map 0:v -codec copy output.mkv
仅复制音频:
ffmpeg -i input -map 0:a -codec copy output.mka
是
0:v
一个流说明符,告诉 ffmpeg 仅包含来自第一个输入的0
视频流v
。这可以进一步扩展。如果您的输入包含多个视频流并且您只想要第一个,则使用0:v:0
meansfirst input:video:first video stream
和 将很有用。请参阅 ffmpeg 控制台输出以找出输入中流的顺序。您还可以使用负映射。使用
-map 0 -map -0:a:1
将映射除第二个音频流之外的所有流。-map 0
告诉 ffmpeg 包含来自输入0
(第一个输入)的所有流,然后-map -0:a:1
告诉 ffmpeg 忽略来自第一个输入的第一个音频流。
答案3
第一部分是正确的。第二部分只提取 b.mp4 文件的音频。
ffmpeg -i b.mp4 -vn -acodec copy audio_b.mp3