如何从MP4视频文件中抽取MP3音频?

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从MP4视频文件中抽取MP3音频?相关的知识,希望对你有一定的参考价值。

简 介: 为了能够处理视频中的音频,测试了两种提取视频中的音频方法。一种是利用格式工程软件另外一种利用ffmpeg软件。

关键词 视频文件音频文件mp4mp3

提取音频 目 录
Contents
视频来源 音频提取 利用格式工
厂提取音频
利用moviepy
提取音频
安装ffmpeg 提取总结

 

§01 取音频


1.1 视频来源

  今天在微信中友人给我发送了一段有趣的视频。这段视频演示了清新优雅的弹拨乐来自于饭盒上的九条橡皮筋,令人不禁感慨飞花摘叶皆可伤人,草木竹石均可为剑,诚不我欺也.

▲ 图1 饭盒、筷子、橡皮筋

  现在留下一个问题:

  • 这段音乐中各个音符对应的频率是多少?
  • 在一定的假设下,各个橡皮筋对应的振动频率是否满足音乐音节要求?

1.2 音频提取

  为了回答上面的问题,第一步需要从MP4文件中将视频音频提取出来。可以使用 格式工厂(Format Factory) 完成音频数据的提取。

1.2.1 利用格式工厂提取音频

(1)下载格式工程软件

  从 格式工厂(Format Factory) 下载最新版本软件并进行安装。

▲ 图1.2.1 安装Format Factory软件

(2)分离视频文件中音频

  利用软件中的 “ ->MP3” 将MP4文件中的音频分离出来。

▲ 图1.2.2 利用Format Factory分离MP3

(3)音频预处理

  利用 Audacity 软件对分离的MP3 的音频文件进行预处理。

  利用软件中的特效增幅对于原来音频波形进行放大。如下是放大后的音频波形。

▲ 图1.2.3 利用Audacity 对音频文件进行预处理

1.2.2 利用moviepy提取音频

  在bing中利用“python extract MP4 sounds” 搜索,可以获得如下一篇博文:

  博文中给出了应用 moviepy 来提取视频中的音频数据。

(1)处理软件

from headm import *                 # =

from moviepy.editor import *

def mp4tomp3(mp4file, mp3file):
    videoclip = VideoFileClip(mp4file)
    audioclip = videoclip.audio
    audioclip.write_audiofile(mp4file)
    audioclip.close()
    videoclip.close()

mp4filename = r'D:\\Temp\\WeChat_20220213170345.mp4'
mp3filename = mp4filename.split('.')[0] + '.mp3'
printt(mp4filename|, mp3filename:)

mp4tomp3(mp4filename, mp3filename)

(2)运行错误

  运行之后出现了错误:

---------- [PYTHON INFOR] ----------
MoviePy - Writing audio in D:\\Temp\\WeChat_20220213170345.mp4
chunk:   0%|                                 | 0/507 [00:00<?, ?it/s, now=None]
chunk:   0%|                                 | 0/507 [00:00<?, ?it/s, now=None]chunk:   4%|▉                      | 21/507 [00:00<00:02, 209.99it/s, now=None]Traceback (most recent call last):
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\audio\\io\\ffmpeg_audiowriter.py", line 74, in write_frames
    self.proc.stdin.write(frames_array.tobytes())
BrokenPipeError: [Errno 32] Broken pipe
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "D:\\Temp\\TEMP0001\\test1.PY", line 25, in <module>
    mp4tomp3(mp4filename, mp3filename)
  File "D:\\Temp\\TEMP0001\\test1.PY", line 15, in mp4tomp3
    audioclip.write_audiofile(mp4file)
  File "<C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\decorator.py:decorator-gen-45>", line 2, in write_audiofile
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\audio\\AudioClip.py", line 210, in write_audiofile
    logger=logger)
  File "<C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\decorator.py:decorator-gen-9>", line 2, in ffmpeg_audiowrite
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\audio\\io\\ffmpeg_audiowriter.py", line 170, in ffmpeg_audiowrite
    writer.write_frames(chunk)
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\audio\\io\\ffmpeg_audiowriter.py", line 117, in write_frames
    raise IOError(error)
OSError: [Errno 32] Broken pipe
MoviePy error: FFMPEG encountered the following error while writing file D:\\Temp\\WeChat_20220213170345.mp4:
b"Invalid encoder type 'libx264'\\r\\n"
In case it helps, make sure you are using a recent version of FFMPEG (the versions in the Ubuntu/Debian repos are deprecated).
                                                                               Exception ignored in: <function FFMPEG_AudioWriter.__del__ at 0x0000000017880268>
Traceback (most recent call last):
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\audio\\io\\ffmpeg_audiowriter.py", line 132, in __del__
    self.close()
  File "C:\\Users\\zhuoqing\\Anaconda3\\lib\\site-packages\\moviepy\\audio\\io\\ffmpeg_audiowriter.py", line 121, in close
    self.proc.stdin.close()
OSError: [Errno 22] Invalid argument

  这说明一个问题,需要软件中正确安装FFMPEG软件。

  这个问题在 Python extract wav from video file 也被网友提到过,如何能够避免使用ffmpeg。

My question is how could I extract wav audio track from video file, say video.avi? I read many articles and everywhere people suggest to use (from Python) ffmpeg as a subprocess (because there are no reliable python bindings to ffmpeg - the only hope was PyFFmpeg but i found it is unmaintaned now). I don’t know if it is right solution and i am looking for good one.

I looked to gstreamer and found it nice but unable to satisfy my needs – the only way I found to accomplish this from command line looks like、

  这个情况在网友使用过程中都发现必须安装FFMPEGA,比如 一段把mp4中的音频提取并保存在原目录的python脚本

▲ 图1.2.4 绕不开的ffmpeg软件

  甚至在 Extract MP3 audio from Videos using a Python script 将 ffmpeg又重新包装成函数被调用来获取MP4中的音频数据。

1.2.3 安装ffmpeg

  既然绕不开,那么就安装ffmpeg软件。 在 How to Install FFmpeg on Windows 给出了安装ffmpeg的方法。

(1)下载ffmpeg

  在 ffmpeg官方网站 : https://ffmpeg.org/download.html 下载所需要的软件版本。

▲ 图1.2.5 FFMPEG 官方下载软件

  下面给出了两个Windows EXE files下载链接:

  • Windows builds from gyan.dev
  • Windows builds by btbN

  不清楚这两个版本有什么差别,现在选择第一个:builds from gyan.dev。

▲ 图1.2.6 选择Windows EXE 版本

▲ 图1.2.7 选择下载发行版本

  下载后是一个ZIP压缩文件:

  • D:\\Temp\\ffmpeg-5.0-essentials_build.zip

(2)解压缩文件

  利用 Windows 版本的 Bandizip 对其进行加压缩。

  解压缩有产生ffmpeg目录,其中包含有bin 目录,其中包含有ffmpeg.exe可执行文件。

└─ffmpeg-5.0-essentials_build
    │  LICENSE
    │  README.txt
    ├─bin
    │      ffmpeg.exe
    │      ffplay.exe
    │      ffprobe.exe
    ├─doc
    │      bootstrap.min.css
    │      default.css
    │      developer.html
    │      faq.html
    │      fate.html
    │      ffmpeg-all.html
    │      ffmpeg-bitstream-filters.html
    │      ffmpeg-codecs.html
    │      ffmpeg-devices.html
    │      ffmpeg-filters.html
    │      ffmpeg-formats.html
    │      ffmpeg-protocols.html
    │      ffmpeg-resampler.html
    │      ffmpeg-scaler.html
    │      ffmpeg-utils.html
    │      ffmpeg.html
    │      ffplay-all.html
    │      ffplay.html
    │      ffprobe-all.html
    │      ffprobe.html
    │      general.html
    │      git-howto.html
    │      libavcodec.html
    │      libavdevice.html
    │      libavfilter.html
    │      libavformat.html
    │      libavutil.html
    │      libswresample.html
    │      libswscale.html
    │      mailing-list-faq.html
    │      nut.html
    │      platform.html
    │      style.min.css
    └─presets
            libvpx-1080p.ffpreset
            libvpx-1080p50_60.ffpreset
            libvpx-360p.ffpreset
            libvpx-720p.ffpreset
            libvpx-720p50_60.ffpreset

(3)添加环境变量

  将 ffmpegbin 添加在 系统设置 中的 path 变量中。通过编辑可以将 bin目录粘贴在 path 最后。中间使用分号“”隔开。

▲ 图1.2.8 设置系统的环境变量

(4)测试FFMPEG

  利用下面的命令提取视频中的音频:

ffmpeg -i music.mp4 music.wav
ffmpeg -i music.mp4 music.mp3

  上面两个命令可以分别产生 music.wav, music.mp3文件。

 

取总结 ※


  了能够处理视频中的音频,测试了两种提取视频中的音频方法。一种是利用格式工程软件另外一种利用ffmpeg软件。


■ 相关文献链接:

● 相关图表链接:

以上是关于如何从MP4视频文件中抽取MP3音频?的主要内容,如果未能解决你的问题,请参考以下文章

3GP有没有能转换音频和视频的

如何将MP4格式的音乐MV转换成mp3格式

ffmpeg_拼接并提取flv视频文件中的音频生成mp3文件

使用ffmpeg将文件夹中的所有mp4音频文件转换为mp3 [重复]

当我使用 ffmpeg 从视频中提取音频时,出现错误

有没有一种快速的方法可以将 mp3 文件与 python 中的 mp4 文件结合起来?