使用 ffmpeg 和 python 将视频中的所有音频流提取到单独的音频文件中

Posted

技术标签:

【中文标题】使用 ffmpeg 和 python 将视频中的所有音频流提取到单独的音频文件中【英文标题】:Extract all audio streams from video into seperate audio files using ffmpeg and python 【发布时间】:2020-11-14 21:38:08 【问题描述】:

我正在尝试从视频中提取所有音频流/音轨(无论您想如何称呼它们),并使用 python 和 ffmpeg 将每个音频文件保存到单独的音频文件中。 问题是,我需要知道有多少音频流,我不想手动输入文件的流数,也不想为每个文件运行 ffmpeg 命令来弄清楚。 程序有没有办法计算出有多少流,以便我可以将每个流提取到单独的文件中?

这是一个sn-p的代码 inputFiles是每个正在输入的视频文件的目录列表_dir_in是所有输入文件所在的目录_dir_out是代码输出的所有文件所在的目录

for video in inputFiles:
    number_of_audio_streams = 0 # this is where I need to know how many audio streams there are
    for i in range(number_of_audio_stremas):
        subprocess.call(f'ffmpeg -i _dir_in/video -map 0:a:str(i) _dir_out/audio/video-str(i).m4a')

【问题讨论】:

【参考方案1】:

没有单独使用ffmpeg 自动提取所有音频流的方法。

您可以使用ffprobe 来确定音频流/轨道的数量:

$ ffprobe -loglevel error -select_streams a -show_entries stream=codec_type -of default=nw=1 input.mkv
  codec_type=audio
  codec_type=audio
  codec_type=audio

这个例子表明input.mkv有3个音频流。

您可以根据自己的喜好对其进行解析以获取总数。使用wc -l 的示例:

$ ffprobe -loglevel error -select_streams a -show_entries stream=codec_type -of default=nw=1 input.mkv | wc -l
  3

对于您在 Python 中实现解决方案应该是一个好的开始(我对 Python 的了解不够,无法给您复制和粘贴答案)。

【讨论】:

这很有帮助,谢谢。我不得不使用不同的 cmd 而不是 wc -1 因为我在 Windows 上大声笑 @Insberr Windows 等价物是什么? 我用过find /c /v ""

以上是关于使用 ffmpeg 和 python 将视频中的所有音频流提取到单独的音频文件中的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg的使用——PHP转换视频截取视频以及JW Player播放器控制

如何合并文件夹中的所有视频以使用 FFMPEG 制作单个视频文件

将音频和视频块从 python 中传输到 ffmpeg 的最佳方法

python 使用ffmpeg-python将numpy数组转换为视频帧

Python 批量提取视频中的音频

Python3 批量提取视频中的音频