• 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()
  • 相关阅读:
    Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTCTime)、文件时间(FileTime)之间的转换
    VS2008驱动开发环境配置
    delete和delete[]的区别
    手动加载NT式驱动(非工具)修改注册表实现
    结构体的内存空间分配原理
    NT式驱动的卸载
    NT式驱动的安装
    struct tm>time() localtime() gmtime()
    64位驱动数字签名
    SQL Server 数据库错误修改
  • 原文地址:https://www.cnblogs.com/Qqun821460695/p/11971703.html
Copyright © 2020-2023  润新知