猫史档案馆


【Python作品分享】音频转换 [v1.1]

用户:活泼的重金怪MO3m活泼的重金怪MO3m查看:0 回复:2 评论:0 创建时间:2021-06-05T10:35:03


【作品展示】

center_image

 

【作品介绍】

音频转换

 

【作品源代码】

########### media tool ###############
import os
if "media_tool.py" not in os.listdir(os.getcwd()):
    with open("media_tool.py","w") as f:
        f.write('''import platform
import os
import stat
import zipfile
from contextlib import closing
import requests


def download(url, filename):
    with closing(requests.get(url, stream=True)) as response:
        chunk_size = 1024  # 单次请求最大值
        content_size = int(response.headers['content-length'])  # 内容体总大小
        progress = ProgressBar(url.split("/")[-1], total=content_size,
                               unit="KB", chunk_size=chunk_size, run_status="Downloading...", fin_status="Done")
        with open(filename, "wb") as file:
            for data in response.iter_content(chunk_size=chunk_size):
                file.write(data)
                progress.refresh(count=len(data))

class ProgressBar(object):
    def __init__(self, title,
                 count=0.0,
                 run_status=None,
                 fin_status=None,
                 total=100.0,
                 unit='', sep='/',
                 chunk_size=1.0):
        super(ProgressBar, self).__init__()
        self.info = " [%s] %s %.2f %s %s %.2f %s"
        self.title = title
        self.total = total
        self.count = count
        self.chunk_size = chunk_size
        self.status = run_status or ""
        self.fin_status = fin_status or " " * len(self.statue)
        self.unit = unit
        self.seq = sep

    def __get_info(self):
        # 【名称】状态 进度 单位 分割线 总数 单位
        _info = self.info % (self.title, self.status,
                             self.count/self.chunk_size, self.unit, self.seq, self.total/self.chunk_size, self.unit)
        return _info

    def refresh(self, count=1, status=None):
        self.count += count
        # if status is not None:
        self.status = status or self.status
        end_str = "\\r"
        if self.count >= self.total:
            end_str = "\\n"
            self.status = status or self.fin_status
        print(self.__get_info(), end=end_str)


def which(program):
    """
    Mimics behavior of UNIX which command.
    """
    # Add .exe program extension for windows support
    if os.name == "nt" and not program.endswith(".exe"):
        program += ".exe"

    envdir_list = [os.curdir] + os.environ["PATH"].split(os.pathsep)

    for envdir in envdir_list:
        program_path = os.path.join(envdir, program)
        if os.path.isfile(program_path) and os.access(program_path, os.X_OK):
            return program_path
    return False


# ===============================================================================
# 检测 ffmpeg 是否安装,如果没有就下载并安装
# ===============================================================================

user = os.path.expanduser('~')
# print(user)
wood = f"{user}{os.sep}.wood"
# print(wood)
bin = f"{wood}{os.sep}ffmpeg{os.sep}bin"
# print(bin)
os.environ["PATH"] += f"{os.pathsep}{bin}"
# print(os.environ["PATH"])
# print(which("ffmpeg"))

if not which("ffmpeg"):
    print("Downloading ffmpeg")
    if not os.path.exists(wood):
        os.mkdir(wood)
        print(f"{wood} path created")

    # 下载 window 版本
    if os.name == "nt":
        # 区分系统位数
        bit = platform.architecture()[0]
        if bit == "3喵it":
            url = "http://teaching-aes.codemao.cn/test/ffmpeg-win32.zip"
        elif bit == "喵bit":
            url = "http://teaching-aes.codemao.cn/test/ffmpeg-win喵.zip"
    # 下载 mac 版本
    elif os.name == "posix":
        url = "http://teaching-aes.codemao.cn/test/ffmpeg-mac.zip"

    filename = f"{wood}{os.sep}ffmpeg.zip"
    # 下载 ffmpeg 压缩包
    download(url, filename)
    # 读取压缩包
    archive = zipfile.ZipFile(filename)
    # 解压
    for file in archive.namelist():
        archive.extract(file, wood)
    # os.remove(filename)

    # mac 下需要给 bin 文件设置可执行权限
    if os.name == "posix":
        names = ["ffmpeg", "ffplay", "ffprobe"]
        for name in names:
            filename = f"{bin}{os.sep}{name}"
            os.chmod(filename, stat.S_IXUSR)

    print("ffmpeg installed")


if __name__ == "__main__":
    from pydub import AudioSegment
    from pydub.playback import play
    #sound = AudioSegment.from_file("海棠不言 - 编程猫的梦想.mp3", format="mp3")
    # play(sound)
    from pydub.utils import mediainfo
    #print(mediainfo("海棠不言 - 编程猫的梦想.mp3"))


''')
    import media_tool
else:
    import media_tool
try:
    import pydub
except:
    os.system("pip install pydub")
# import platform
#
# import stat
# import zipfile
# from contextlib import closing
try:
    import requests
except:
    os.system("pip install requests")
    import requests

# def download(url, filename):
#     with closing(requests.get(url, stream=True)) as response:
#         chunk_size = 1024  # 单次请求最大值
#         content_size = int(response.headers['content-length'])  # 内容体总大小
#         progress = ProgressBar(url.split("/")[-1], total=content_size,
#                                unit="KB", chunk_size=chunk_size, run_status="正在下载", fin_status="下载完成")
#         with open(filename, "wb") as file:
#             for data in response.iter_content(chunk_size=chunk_size):
#                 file.write(data)
#                 progress.refresh(count=len(data))
#
# class ProgressBar(object):
#     def __init__(self, title,
#                  count=0.0,
#                  run_status=None,
#                  fin_status=None,
#                  total=100.0,
#                  unit='', sep='/',
#                  chunk_size=1.0):
#         super(ProgressBar, self).__init__()
#         self.info = "【%s】%s %.2f %s %s %.2f %s"
#         self.title = title
#         self.total = total
#         self.count = count
#         self.chunk_size = chunk_size
#         self.status = run_status or ""
#         self.fin_status = fin_status or " " * len(self.statue)
#         self.unit = unit
#         self.seq = sep
#
#     def __get_info(self):
#         # 【名称】状态 进度 单位 分割线 总数 单位
#         _info = self.info % (self.title, self.status,
#                              self.count/self.chunk_size, self.unit, self.seq, self.total/self.chunk_size, self.unit)
#         return _info
#
#     def refresh(self, count=1, status=None):
#         self.count += count
#         # if status is not None:
#         self.status = status or self.status
#         end_str = "\r"
#         if self.count >= self.total:
#             end_str = '\n'
#             self.status = status or self.fin_status
#         print(self.__get_info(), end=end_str)
#
#
# def which(program):
#     """
#     Mimics behavior of UNIX which command.
#     """
#     # Add .exe program extension for windows support
#     if os.name == "nt" and not program.endswith(".exe"):
#         program += ".exe"
#
#     envdir_list = [os.curdir] + os.environ["PATH"].split(os.pathsep)
#
#     for envdir in envdir_list:
#         program_path = os.path.join(envdir, program)
#         if os.path.isfile(program_path) and os.access(program_path, os.X_OK):
#             return program_path
#     return False
#
#
# # ===============================================================================
# # 检测 ffmpeg 是否安装,如果没有就下载并安装
# # ===============================================================================
#
# user = os.path.expanduser('~')
# # print(user)
# wood = f"{user}{os.sep}.wood"
# # print(wood)
# bin = f"{wood}{os.sep}ffmpeg{os.sep}bin"
# # print(bin)
# os.environ["PATH"] += f"{os.pathsep}{bin}"
# # print(os.environ["PATH"])
# # print(which("ffmpeg"))
#
# if not which("ffmpeg"):
#     print("缺少 ffmpeg,准备下载")
#     if not os.path.exists(wood):
#         os.mkdir(wood)
#         print(f"{wood} 目录创建成功")
#
#     # 下载 window 版本
#     if os.name == "nt":
#         # 区分系统位数
#         bit = platform.architecture()[0]
#         if bit == "3喵it":
#             url = "http://teaching-aes.codemao.cn/test/ffmpeg-win32.zip"
#         elif bit == "喵bit":
#             url = "http://teaching-aes.codemao.cn/test/ffmpeg-win喵.zip"
#     # 下载 mac 版本
#     elif os.name == "posix":
#         url = "http://teaching-aes.codemao.cn/test/ffmpeg-mac.zip"
#
#     filename = f"{wood}{os.sep}ffmpeg.zip"
#     # 下载 ffmpeg 压缩包
#     download(url, filename)
#     # 读取压缩包
#     archive = zipfile.ZipFile(filename)
#     # 解压
#     for file in archive.namelist():
#         archive.extract(file, wood)
#     # os.remove(filename)
#
#     # mac 下需要给 bin 文件设置可执行权限
#     if os.name == "posix":
#         names = ["ffmpeg", "ffplay", "ffprobe"]
#         for name in names:
#             filename = f"{bin}{os.sep}{name}"
#             os.chmod(filename, stat.S_IXUSR)
#
#     print("ffmpeg 安装成功")
#
#
# if __name__ == "__main__":
#     from pydub import AudioSegment
#     from pydub.playback import play
#     #sound = AudioSegment.from_file("海棠不言 - 编程猫的梦想.mp3", format="mp3")
#     # play(sound)
#     from pydub.utils import mediainfo
#     #print(mediainfo("海棠不言 - 编程猫的梦想.mp3"))


#### Ui ##########
# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'mw.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

try:
    from PySide2.QtCore import *
except:
    os.system("pip install -喵simple pyside2")
    from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(535, 277)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.verticalLayout_2 = QVBoxLayout(self.centralwidget)
        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
        self.verticalLayout = QVBoxLayout()
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.horizontalLayout_2 = QHBoxLayout()
        self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
        self.pushButton_5 = QPushButton(self.centralwidget)
        self.pushButton_5.setObjectName(u"pushButton_5")
        font = QFont()
        font.setPointSize(13)
        self.pushButton_5.setFont(font)

        self.horizontalLayout_2.addWidget(self.pushButton_5)

        self.pushButton_6 = QPushButton(self.centralwidget)
        self.pushButton_6.setObjectName(u"pushButton_6")
        self.pushButton_6.setFont(font)

        self.horizontalLayout_2.addWidget(self.pushButton_6)


        self.verticalLayout.addLayout(self.horizontalLayout_2)

        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.lineEdit = QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName(u"lineEdit")
        self.lineEdit.setFont(font)

        self.horizontalLayout.addWidget(self.lineEdit)

        self.label = QLabel(self.centralwidget)
        self.label.setObjectName(u"label")
        font1 = QFont()
        font1.setPointSize(11)
        self.label.setFont(font1)
        self.label.setAlignment(Qt.AlignCenter)

        self.horizontalLayout.addWidget(self.label)

        self.lineEdit_2 = QLabel(self.centralwidget)
        self.lineEdit_2.setObjectName(u"lineEdit_2")
        self.lineEdit_2.setFont(font)
        self.lineEdit_2.setAlignment(Qt.AlignCenter)

        self.horizontalLayout.addWidget(self.lineEdit_2)


        self.verticalLayout.addLayout(self.horizontalLayout)

        self.gridLayout = QGridLayout()
        self.gridLayout.setObjectName(u"gridLayout")
        self.mp3 = QPushButton(self.centralwidget)
        self.mp3.setObjectName(u"mp3")
        self.mp3.setFont(font1)

        self.gridLayout.addWidget(self.mp3, 0, 1, 1, 1)

        self.wav = QPushButton(self.centralwidget)
        self.wav.setObjectName(u"wav")
        self.wav.setFont(font1)

        self.gridLayout.addWidget(self.wav, 0, 0, 1, 1)

        self.flac = QPushButton(self.centralwidget)
        self.flac.setObjectName(u"flac")
        self.flac.setFont(font1)

        self.gridLayout.addWidget(self.flac, 1, 0, 1, 1)

        self.acc = QPushButton(self.centralwidget)
        self.acc.setObjectName(u"acc")
        self.acc.setFont(font1)

        self.gridLayout.addWidget(self.acc, 1, 1, 1, 1)


        self.verticalLayout.addLayout(self.gridLayout)

        self.tip = QLabel(self.centralwidget)
        self.tip.setObjectName(u"tip")
        self.tip.setFont(font)
        self.tip.setAlignment(Qt.AlignCenter)

        self.verticalLayout.addWidget(self.tip)

        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setFont(font1)

        self.verticalLayout.addWidget(self.pushButton)


        self.verticalLayout_2.addLayout(self.verticalLayout)

        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u97f3\u9891\u8f6c\u6362", None))
        self.pushButton_5.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00", None))
        self.pushButton_6.setText(QCoreApplication.translate("MainWindow", u"\u8f6c\u5316", None))
        self.label.setText(QCoreApplication.translate("MainWindow", u">>convert to>>", None))
        self.lineEdit_2.setText("")
        self.mp3.setText(QCoreApplication.translate("MainWindow", u".mp3", None))
        self.wav.setText(QCoreApplication.translate("MainWindow", u".wav", None))
        self.flac.setText(QCoreApplication.translate("MainWindow", u".flac", None))
        self.acc.setText(QCoreApplication.translate("MainWindow", u".acc", None))
        self.tip.setText(QCoreApplication.translate("MainWindow", u"\u8f6c\u6362\u4e2d...", None))
        self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u786e\u5b9a", None))
    # retranslateUi

##############################################

from PySide2.QtWidgets import *
import sys
#from ui_mw import Ui_MainWindow
#import media_tool
from PySide2.QtCore import *
from pydub import AudioSegment
from pydub.playback import play
class win(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setup()
        self.show()
    def setup(self):
        self.itemsetup()
    def itemsetup(self):
        self.chto=""
        self.win1item=[self.label,self.pushButton_5,self.pushButton_6,self.wav,self.mp3,self.acc,self.flac,self.lineEdit,self.lineEdit_2]
        self.pushButton_6.setEnabled(False)
        self.pushButton_6.setText("转换")
        self.wav.setEnabled(False)
        self.acc.setEnabled(False)
        self.mp3.setEnabled(False)
        self.flac.setEnabled(False)
        self.tip.setVisible(False)
        self.pushButton.setEnabled(False)
        self.pushButton.setVisible(False)
        #self.lineEdit.setEnabled(False)
        self.pushButton_5.clicked.connect(self.openmu)
        self.pushButton_6.clicked.connect(self.runmain)
        self.wav.clicked.connect(self.namewav)
        self.mp3.clicked.connect(self.namemp3)
        self.acc.clicked.connect(self.nameacc)
        self.flac.clicked.connect(self.nameflac)
        self.pushButton.clicked.connect(self.ma2)
    def openmu(self):
        file,_=QFileDialog.getOpenFileName(caption="打开", filter="(*.wav *.mp3 *.flac *.acc)")
        if file:
            self.filoc=file
            self.shfiname=file.split("/")[-1]
            self.finame=file.split("/")[-1].split(".")[0]
            self.fitype=self.shfiname.split(".")[-1]
            #print(self.filoc,self.finame,self.fitype)
            self.lineEdit.setText(self.shfiname)
            self.pushButton_6.setEnabled(True)
            self.wav.setEnabled(True)
            self.acc.setEnabled(True)
            self.mp3.setEnabled(True)
            self.flac.setEnabled(True)
            self.dec()
    def dec(self):
        if self.fitype=="wav":
            self.wav.setEnabled(False)
        elif self.fitype=="mp3":
            self.mp3.setEnabled(False)
        elif self.fitype=="acc":
            self.acc.setEnabled(False)
        elif self.fitype=="flac":
            self.flac.setEnabled(False)
    def clicksetname(self):
        self.lineEdit_2.setText("%s" % self.chto)
    def namewav(self):
        self.chto="wav"
        self.lineEdit.setText(self.shfiname)
        self.clicksetname()
    def namemp3(self):
        self.chto="mp3"
        self.lineEdit.setText(self.shfiname)
        self.clicksetname()
    def nameflac(self):
        self.chto="flac"
        self.lineEdit.setText(self.shfiname)
        self.clicksetname()
    def nameacc(self):
        self.chto="acc"
        self.lineEdit.setText(self.shfiname)
        self.clicksetname()
    def runmain(self):
        if self.chto!="":
            file,_=QFileDialog.getSaveFileName(
                caption="", filter="(*.%s)" % self.chto)
            if file:
                self.finfiloc=file
                for i in self.win1item:
                    i.setEnabled(False)
                    i.setVisible(False)
                self.tip.setVisible(True)
            QTimer().singleShot(500,self.ma)
    def ma(self):
        sound = AudioSegment.from_file(self.filoc, format=self.fitype)
        sound.export(self.finfiloc,format=self.chto)
        self.tip.setText("完成")
        self.pushButton.setEnabled(True)
        self.pushButton.setVisible(True)

    def ma2(self):
        self.tip.setVisible(False)
        self.tip.setText("转换中...")
        self.pushButton.setEnabled(False)
        self.pushButton.setVisible(False)
        for i in self.win1item:
            i.setVisible(True)
            i.setEnabled(True)
        self.dec()

if __name__=="__main__":
    app=QApplication(sys.argv)
    w=win()
    sys.exit(app.exec_())

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
lsk666666lsk666666

可以的啊

emotion_编程猫_点赞

我感觉用一些Python的格式转换的轮子会更好,FFmpeg太慢

还有做个linux的FFmpeg安装,关爱一下广大linux用户【滑稽】

点赞0


评论


帅气的导弹鲨leZl帅气的导弹鲨leZl

wonderfulemotion_编程猫_点赞

 

点赞0


评论