python使用ffmpeg来制作音频格式转换工具(优化版)

news2024/11/19 1:30:19

简介:一个使用python加上ffmpeg模块来进行音频格式转换的工具。
日志:

20231030:第一版,设置了简单的UI布局和配色,实现音频转为Mp3、AAC、wav、flac四种格式。可解析音频并显示信息,可设置转换后的保存路径

UI界面:
在这里插入图片描述
编程平台:visual studio code
在这里插入图片描述
编程语言:python 3.12.0
模块:ffmpeg、PyQt5
其中ffmpeg是用来处理音频文件的主要模块,PyQt5是用来制作UI界面使用。

ffmpeg安装:
注意这里不要直接pip install ffmpeg

pip install ffmpeg-python

PyQt5安装:

pip install PyQt5

关于PyQt5的使用,本文中不做多介绍,因为pyqt5的使用相对来说是比较简单的。网上非常多的示例可以参考。

下面说一下代码:

音频导入

导入音频文件,使用pyqt5的qfiledialog类getopenfilename方法,如下

 def music_load(self):
        """文件载入"""
        self.filepth,_=QFileDialog.getOpenFileName(self,"选择音频","C:/","Allfile(*);;txt(*.txt)")
        if self.filepth:
            self.lbl2.setText(self.filepth)
            self.music_info_get(self.filepth)
            
        else:
            self.lbl2.setText("路径为空")
获取音频信息

获取音频信息,要用到ffmpeg中的probe功能,probe的参数就是音频文件的文件路径。如果音频文件是正确且存在的,ffmpeg会自动对音频进行分析,返回一个JSON格式的数据集。

   probe=ffmpeg.probe(file)

返回数据示例:

{‘streams’: [{‘index’: 0, ‘codec_name’: ‘wmav2’, ‘codec_long_name’: ‘Windows Media Audio 2’, ‘codec_type’: ‘audio’, ‘codec_tag_string’: ‘a[1][0][0]’, ‘codec_tag’: ‘0x0161’, ‘sample_fmt’: ‘fltp’, ‘sample_rate’: ‘44100’, ‘channels’: 2, ‘bits_per_sample’: 0, ‘initial_padding’: 0, ‘r_frame_rate’: ‘0/0’, ‘avg_frame_rate’: ‘0/0’, ‘time_base’: ‘1/1000’, ‘start_pts’: 0, ‘start_time’: ‘0.000000’, ‘duration_ts’: 280333, ‘duration’: ‘280.333000’, ‘bit_rate’: ‘96024’, ‘extradata_size’: 10, ‘disposition’: {‘default’: 0, ‘dub’: 0, ‘original’: 0, ‘comment’: 0, ‘lyrics’: 0, ‘karaoke’: 0, ‘forced’: 0, ‘hearing_impaired’: 0, ‘visual_impaired’: 0, ‘clean_effects’: 0, ‘attached_pic’: 0, ‘timed_thumbnails’: 0, ‘captions’: 0, ‘descriptions’: 0, ‘metadata’: 0, ‘dependent’: 0, ‘still_image’: 0}, ‘tags’: {‘language’: ‘chi’}}], ‘format’: {‘filename’: ‘F:/音乐/Celine Dion(席琳 迪翁)-My Heart Will Go On.wma’, ‘nb_streams’: 1, ‘nb_programs’: 0, ‘format_name’: ‘asf’, ‘format_long_name’: ‘ASF (Advanced / Active Streaming Format)’, ‘start_time’: ‘0.000000’, ‘duration’: ‘280.333000’, ‘size’: ‘3395127’, ‘bit_rate’: ‘96888’, ‘probe_score’: 100, ‘tags’: {‘DeviceConformanceTemplate’: ‘L1’, ‘artist’: ‘Celine Dion(席琳 迪翁)’, ‘WM/WMADRCAverageReference’: ‘7322’, ‘WM/WMADRCPeakReference’: ‘32767’, ‘title’: ‘My Heart Will Go On’, ‘IsVBR’: ‘0’, ‘album’: ‘泰坦尼克号电影音乐精选’, ‘WMFSDKNeeded’: ‘0.0.0.0000’, ‘WMFSDKVersion’: ‘10.00.00.3708’}}}

以上是probe返回的内容格式,可以看到包含了很多音频文件的信息,如音频名、音频格式、时间、比特率等等,probe实际上是一个字典数据。
所以,如果要想取其中的对应数据来用,只需要对照字典中的键来取值即可。

format=probe['format']
stream=probe['streams'][0]

format和stream又分别是字典类型,再次按照字典来取值:

 		video_time=format['duration']
        video_byte=str(int(format['size'])/1024/1024)
    
        video_rate=stream['bit_rate']
        video_rate2=float(video_rate)/1000
     
        music_name=format['filename']
        music_geshi=format['format_name']
音频格式转换

格式转换功能主要是ffmpeg来完成的,python只需要调用ffmpeg程序即可,因此使用了subprocess模块。

pp=subprocess.Popen(cmdtxt,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,encoding='utf-8',text=True)

关于subprocess的详细使用,大家可以自行搜索,此处不多介绍。
subprocess调用ffmpeg,而ffmpeg的指令格式如下:

ffmpeg指令示例:

ffmpeg -i input.mp3 -acodec pcm_s16le -ac 2 -ar 44100 output.wav

也可以很简单:

ffmpeg -i input.mp3 output.wav

本文中主要使用第二种指令,即简单化。subprocess模块调用ffmpeg程序,而ffmpeg根据传入的指令来对目标进行转换。

以上就是这个音频转换程序的基本逻辑,从使用来说,先载入音频,然后选择要转换的格式,以及转换后保存的路径,最后点击“格式转换”按钮,等待程序自动转换即可,转换完成后会有提示。
在这里插入图片描述
整个操作是很简单的,下面会给出完整代码。

其中,UI界面的配色,是有qss来渲染的。

qss文件的读取,是一个单独的模块:
qss_read.py

class QssRead:
    @staticmethod
    def readQSS(style):
        with open(style, "r",encoding="utf-8") as f:
            return f.read()
 self.qssfile1="M03_musicconvert_pro2023\\qss_main_style.qss"
self.qss1=QssRead.readQSS(self.qssfile1)
self.setStyleSheet(self.qss1)

qss文件:
可以看到,qss文件主要是统一设置UI界面的样式,如颜色、形状、粗细等。

/*
*
窗体背景色为渐变色
*/
QWidget
{
   
    
    background-color:qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #d0f0e8,stop:0.2 #a5f8cc,stop:0.5 #99f56b stop:1 #8EF068);
    
    /*background-color:qradialgradient(cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 red, stop:1 blue)
    */
    /*background-color:qconicalgradient(cx:0.5, cy:0.5, angle:0, stop:0 blue, stop:0.2 yellow,stop:1 #4CF562)
    */
}
QMenuBar
{
   
    background-color:qlineargradient(x1:0, y1:0, 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何把编辑器编辑好的文章分享给别人?

哈喽,大家好,今天小编给大家分享一个非常实用的功能,当我们在使用微信编辑器编辑排版文章的时候,需要在不发表的前提下分享给好友或者需要先给领导看一下的时候该怎么办呢?有三个方法,都可以在不发表的前提…

Ortec974A EPICS IOC程序

1) 创建一个用户存放这个IOC程序结构的目录: rootorangepi4-lts:/usr/local/EPICS/program# mkdir ortec974A rootorangepi4-lts:/usr/local/EPICS/program# cd ortec974A/ rootorangepi4-lts:/usr/local/EPICS/program/ortec974A# ls2)使用…

系列四十二、Spring的事务传播行为案例演示(二)#REQUIRED

一、演示Spring的默认传播行为(REQUIRED) 1.1、运行之前表中的数据 1.2、StockServiceImpl /*** Author : 一叶浮萍归大海* Date: 2023/10/30 15:43* Description:*/ Service(value "stockServiceREQUIRED") public class StockServiceImpl…

Mysql设置了更新时间自动更新,指定更新部分sql时不进行时间更新

现象&#xff1a; 因为字段设置了自动更新&#xff0c;所以sql语句一进行修改此字段就会自动更新时间&#xff0c;但是呢我们的有部分定时任务是半夜执行&#xff0c;并且不能让这个任务修改到数据的更新时间 解决&#xff1a; <update id"updateCreative">ALT…

element-plus DateTimePicker日期选择器,限制指定日期和时间不可选择

element-plus日期选择器&#xff0c;在指定日期时间前不可选择。 限制日期选择&#xff0c;使用disabled-date 限制小时选择&#xff0c;使用disabled-hours 限制分钟选择&#xff0c;使用disabled-minutes 限制毫秒选择&#xff0c;使用disabled-seconds 指定日期当天的时间有…

一带一路10周年:爱创科技加速中国药企国际化征程

“源自中国&#xff0c;属于世界”。 共建“一带一路”倡议提出10周年来&#xff0c;中国与沿线国家经济深度融合&#xff0c;在共商共建共享的基本原则下&#xff0c;“一带一路”形成了国际合作的平台和机制&#xff0c;跨国经济合作已基本形成。 随着“一带一路”合作日益加…

【脚本笔记】AssetDatabase

AssetDatabase是编辑器下的处理资源操作的重要类&#xff0c;主要用于访问资源并针对资源执行操作的接口。 这里面所有的操作路径都是基于Unity项目的相对路径也就是Assets/xxx或者Assets/xxx.jpg这种。CacheServer 主要解决的是缩短大型团队导入资源的时间。当配置后&#xff…

K8S部署应用时从harbor拉取镜像失败

问题描述 K8S部署服务拉取镜像失败&#xff1a;ImagePullBackOff K8S拉取镜像提示&#xff1a;Failed to pull image “IP:PORT/zcy-project/nginx:1.16.1”: rpc error: code Unknown desc Error response from daemon: unauthorized: unauthorized to access repository: …

mediapipe 训练自有图像数据分类

参考&#xff1a; https://developers.google.com/mediapipe/solutions/customization/image_classifier https://colab.research.google.com/github/googlesamples/mediapipe/blob/main/examples/customization/image_classifier.ipynb#scrollToplvO-YmcQn5g 安装&#xff1a…

配音软件怎么选?推荐三款自用好评的

会刷短视频的小伙伴肯定知道&#xff0c;很多创作者想让自己的视频更加丰富&#xff0c;呈现更加完美的视频效果&#xff0c;往往会在视频里的空境部分加入一些旁白解说&#xff0c;你们难道就不好奇吗&#xff1f;这些声音为什么这么想真人说的话&#xff0c;而且还可以这么自…

虚幻C++基础 day1

虚幻C概念 虚幻C类的继承结构 虚幻引擎C类层级结构(Hierarchy) 这些基本类又派生出了很多子类&#xff0c;例&#xff1a; UE中的反射与垃圾回收系统 例如一个创建了一个Actor类&#xff0c;有一个Actor类型指针去指向这个Actor类&#xff0c;如果的指针被销毁了&#xff…

编译环境里存在yaml-cpp的多个版本时可能引起的问题

有时要编译的程序自带了特定版本的yaml-cpp&#xff0c;同时系统目录下也安装了更高版本的yaml-cpp&#xff0c;这时可能引起编译错误&#xff0c;就是某些yaml-cpp的API不认识&#xff0c;例如&#xff1a; 出现这种问题倒好办&#xff0c;正常情况下不可能&#xff0c;肯定能…

目标检测算法发展史

前言 比起图像识别&#xff0c;现在图片生成技术要更加具有吸引力&#xff0c;但是要步入AIGC技术领域&#xff0c;首先不推荐一上来就接触那些已经成熟闭源的包装好了再提供给你的接口网站&#xff0c;会使用别人的模型生成一些图片就能叫自己会AIGC了吗&#xff1f;那样真正…

电脑突然提示找不到msvcp140.dll怎么办,解决msvcp140.dll丢失的办法

当我们在电脑上运行某些软件或游戏时&#xff0c;可能会遇到一个常见的错误消息&#xff1a;“找不到msvcp140.dll”。出现这样的情况通常意味着系统缺少一个重要的动态链接库文件&#xff0c;而这可能会导致程序无法正常启动。如果你现在遇到了这个问题&#xff0c;哪有可以用…

人大与加拿大女王大学金融管理硕士项目:开启国际视野,成就金融领袖

生活中&#xff0c;我们总会遇到各种各样的困难和挑战。有时候&#xff0c;我们会感到沮丧、迷茫甚至绝望。但是&#xff0c;正是这些困难和挑战&#xff0c;让我们变得更加坚强、勇敢和成熟。在这个职场竞争愈发激烈的时代&#xff0c;不断地充实自己是非常重要的。如果你从事…

Echats-页面切换时echats图表刷新

在src文件夹下的composables创建echats.ts echats.ts的内容为&#xff1a; import { nextTick, effectScope, onScopeDispose, ref, watch } from vue; import type { ComputedRef, Ref } from vue; import * as echarts from echarts/core; import { BarChart, GaugeChart, L…

Golang | Zinx学习笔记(一)

参考 http://zinx.me/ https://www.kancloud.cn/aceld/zinx/1960213 https://www.yuque.com/aceld/tsgooa/gx01meg5ow4pftac 说明 zinx是一个基于Golang的轻量级并发服务器框架。 目前zinx已经在很多企业进行开发使用&#xff0c;具体使用领域包括:后端模块的消息中转、长链…

Mybatis-Plus通用枚举功能 [MyBatis-Plus系列] - 第493篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 S…

win 下安装 nvm 的使用与配置

nvm 全名 node.js version management&#xff0c;是一个 nodejs 的版本管理工具。通过它可以安装和切换不同版本的 nodejs。 注&#xff1a;如果已经安装了 nodejs 需先卸载后再安装 nvm 为了确保 nodejs 已彻底删除&#xff0c;可以看看安装目录中是否有 node 文件夹&#x…