Python小工具:3秒钟将视频转换为音频
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者: pk 哥
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef
安装导入
用 pip 命令快速安装。
- pip install ffmpy3
导入刚才安装好的 ffmpy3 库,等下需要读取视频存放的目录和音频存放的目录,所以我们需要导入 os 模块。
- import os
- from ffmpy3 import FFmpeg
创建保存音频的目录
我们需要把转换后的音频文件存放在指定的文件夹里,为了更智能,我们做一个判断,如果不存在这个目录,我们就创建,存在的话就保持不变。
- 1 def mkdir_output(output_dir):
- 2 existence = os.path.exists(output_dir)
- 3 if not existence:
- 4 print(\'创建音频存放目录\')
- 5 os.makedirs(output_dir) # 创建目录
- 6 os.chdir(output_dir) # 切换到创建的文件夹
- 7 return True
- 8 else:
- 9 print(\'目录已存在,即将保存!\')
- 10 return False
存放路径我们作为参数,等下调用时给出存放路径即可。
文件格式处理
我们把需要转换为音频的视频文件放在一个文件夹下面,用 os 模块把视频的文件名称读取出来,放在列表中。
- 1 filepath = r"/Users/brucepk/test" # 待转换视频存放的路径
- 2 os.chdir(filepath) # 切换到改路径下
- 3 filename = os.listdir(filepath) # 得到文件夹下的所有文件名称
然后我们把所有视频文件后缀替换成音频的格式,视频文件格式较多,我把常见的基本都列出来了。
把相应目录下所有视频文件转换成 wav 音频文件储存在指定目录下。
音频文件属性
只改文件后缀当然是不行,文件属性没有转变,这样的文件是无法读取的,我们需要用 FFmpeg 方法对转换后的音频文件赋予它音频的属性。
- 1 ff = FFmpeg(
- 2 inputs={changefile: None},
- 3 outputs={outputfile: \'-vn -ar 44100 -ac 2 -ab 192 -f wav\'}
- 4 )
- 5 print(ff.cmd)
- 6 ff.run()
效果
我在 test 目录下放在两个视频文件,一个是我用手机拍摄的 mp4 格式的视频,为了测试出效果,录了一段语音,另一个视频是 mkv 格式的一部电影。
运行代码后,会自动创建一个 output 文件夹,里面就是转换好的音频文件。
用支持音频的软件打开,可以清晰听到音频。
运行报错处理
1、当你运行代码时,Windows 系统可能会出现 ffmpeg 无法找到之类的报错,如下图所示。
这时,我们需要下载 FFmpeg,访问下面的地址,根据自身电脑版本下载相应安装包。
解压 ffmpeg 文件,打开 ffmpy3.py 文件(按住Ctrl键,点击ffmpy3,快速跳转到该模块),将下面代码中参数 executable 的值改为 ffmpeg.exe 可执行文件的绝对路径。
- __init__(self, executable=\'ffmpeg\', global_options=None, inputs=None, outputs=None)
解压后的 ffmpeg.exe 文件在 bin 目录下,把路径替换掉。
修改后,再次运行,就可以顺利转换了。
2、路径拼接的问题
我的代码是在 Mac 系统中完成的,Mac 中路径是用 / 隔开,而 Windows 中是用 \,为了防止收到转义字符的影响,路径前面最好加上 r。
- filepath = r"/Users/brucepk/test"
所以在路径拼接时,Windows 电脑记得 “/” 换成 ““。
- changefile = filepath+"/"+filename[i]
以上时 Mac 系统的写法,Windows 中改成:
- changefile = filepath+"\\"+filename[i]
- 完整代码
- 1 import os
- 2 from ffmpy3 import FFmpeg
- 3
- 4 def mkdir_output(output_dir):
- 5 existence = os.path.exists(output_dir)
- 6 if not existence:
- 7 print(\'创建音频存放目录\')
- 8 os.makedirs(output_dir) # 创建目录
- 9 os.chdir(output_dir) # 切换到创建的文件夹
- 10 return True
- 11 else:
- 12 print(\'目录已存在,即将保存!\')
- 13 return False
- 14
- 15
- 16 if __name__ == \'__main__\':
- 17 filepath = r"/Users/brucepk/test" # 待转换视频存放的路径
- 18 os.chdir(filepath) # 切换到改路径下
- 19 filename = os.listdir(filepath) # 得到文件夹下的所有文件名称
- 20
- 21 output_dir = r\'/Users/brucepk/output\' # 转换后音频文件存放的路径
- 22 mkdir_output(output_dir)
- 23 for i in range(len(filename)):
- 24 # windows电脑记得把下面两处的 "/" 换成 "\\"
- 25 changefile = filepath+"/"+filename[i]
- 26 outputfile = output_dir+"/"+filename[i].replace(\'mp4\', \'wav\').replace(\'mkv\', \'wav\')\
- 27 .replace(\'rmvb\', \'wav\').replace(\'3gp\', \'wav\').replace(\'avi\', \'wav\')\
- 28 .replace(\'mpeg\', \'wav\').replace(\'mpg\', \'wav\').replace(\'dat\', \'asf\')\
- 29 .replace(\'wmv\', \'wav\').replace(\'flv\', \'wav\').replace(\'mov\', \'wav\')\
- 30 .replace(\'mp4\', \'wav\').replace(\'ogg\', \'wav\').replace(\'ogm\', \'wav\')\
- 31 .replace(\'rm\', \'wav\')
- 32
- 33 ff = FFmpeg(
- 34 inputs={changefile: None},
- 35 outputs={outputfile: \'-vn -ar 44100 -ac 2 -ab 192 -f wav\'}
- 36 )
- 37 print(ff.cmd)
- 38 ff.run()