it编程 > 前端脚本 > Python

Python脚本实现音频和视频格式转换

1人参与 2025-03-10 Python

一、音频格式转换完整代码

from pydub import audiosegment
import os
 
 
def convert_audio(input_dir, output_dir, target_format):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
 
    for filename in os.listdir(input_dir):
        if filename.endswith(('.mp3', '.wav', '.ogg')):
            input_path = os.path.join(input_dir, filename)
            output_filename = os.path.splitext(filename)[0] + f".{target_format}"
            output_path = os.path.join(output_dir, output_filename)
 
            audio = audiosegment.from_file(input_path)
            audio.export(output_path, format=target_format)
            print(f"converted {filename} to {output_filename}")
 
 
convert_audio("./input_audio", "./output_audio", "mp3")

二、视频格式转换完整代码

from moviepy import *
 
def convert_video_format(input_path, output_path):
    """将视频转换为不同格式"""
    try:
        video = videofileclip(input_path)
        video.write_videofile(output_path)
        video.close()
        print(f"转换完成: {output_path}")
    except exception as e:
        print(f"转换失败: {str(e)}")
 
# 使用示例
convert_video_format("input.mp4", "output.avi")

三、方法补充

python脚本实现批量格式转换(视频转音频)

利用ffmpeg工具和python,实现批量视频/音频格式转换。本例只给出视频转音频(.wav)方法,更多格式转换可百度ffmpeg用法,修改代码中对应语句即可。

# coding=utf-8
import os, sys
import subprocess
from scipy.io import wavfile

def ffmpeg_videotoaudio(videopath, wavpath):
    # 提取视频路径下所有文件名
    videos = os.listdir(videopath)
    count = 0
    for video in videos:
        # 提取视频的全路径名(含路径+文件名)
        video_path = videopath + "\\" + video
        # 合成输出音频的全路径名(不含后缀)
        wav_path = wavpath + "\\" + os.path.splitext(video)[0]
        # 提取视频中的音频信息
        strcmd = "ffmpeg -i " + video_path + " -f wav " + wav_path + ".wav"
        subprocess.call(strcmd, shell=true)

videopath = r'd:\videos'
wavpath = r'd:\audios'
ffmpeg_videotoaudio(videopath,wavpath)

python整合ffmpeg实现视频文件的批量转换

我们的思路是,设定一个文件夹存放源视频文件,python读取该文件夹下的全部文件,并对文件通过ffmpeg进行分析,根据需要,修改目标文件的编码、分辨率等等,调用ffmpeg转换。

我这次的需求是,我家液晶电视只支持分辨来,长宽均小于720,编码只支持divx/xvid的avi文件,且fps只能小于25——多次实践,才总结出来的,电视说明书也没说!!

下面的程序将/root//root2/video/origin下存在的全部文件转换成液晶电视需要的avi格式电影

以下是最新的修改,引入了optionparser  参数分析工具。能指定最大宽度,音视频编码,视频质量,原路径,目的路径,工作路径等

# coding=gb2312
import string
import os
import time
import re
import sys
from optparse import optionparser
parser = optionparser()
#parser.add_option("-i", "--input", dest="input",action="store_true",help="input x y for each file by user")
parser.add_option("-q", "--quality", dest="q",action="store",help="input xvid q arg",default="24")
parser.add_option("-v", "--vcodec", dest="vcodec",action="store",help="input video codec",default="x264")
parser.add_option("-n", "--noaudio", dest="an",action="store_true",help="no audio")
parser.add_option("-p", "--preset", dest="preset",action="store",help="",default="")
parser.add_option("-m", "--maxwidth", dest="maxwidth",action="store",help="input max width for output video",default="")
parser.add_option("-f", "--filetype", dest="filetype",action="store",help="",default="mp4")
parser.add_option("-o", "--ogg", dest="ogg",action="store_true",help="user ogg instead of aac",default="")
parser.add_option("-3", "--mp3", dest="mp3",action="store_true",help="user mp3 instead of aac",default="")
parser.add_option("-1", "--pad", dest="pad",action="store_true",help="pad to 16:9",default="")
parser.add_option("-s", "--src", dest="srcd",action="store",help="source dir",default="/usr/disk2/root/video/origin")
parser.add_option("-t", "--target", dest="targetd",action="store",help="target dir",default="/usr/disk2/root/video/ok")
parser.add_option("-w", "--workdir", dest="workdir",action="store",help="work dir",default="/root/root2/video")
(options, args) = parser.parse_args()
if options.srcd==none or options.srcd[0:1]=='-':
print 'srcd err, quit'
exit()
if options.targetd==none or options.targetd[0:1]=='-':
print 'targetd err, quit'
exit()
if options.filetype==none or options.filetype[0:1]=='-':
print 'filetype err, quit'
exit()
if options.workdir==none or options.workdir[0:1]=='-':
print 'workdir err, quit'
exit()
#遍历origin下的文件
for root,dirs,files in os.walk(options.srcd):
for name in files:
name= name.replace('[','''\[''')#对文件名中的[进行转义
newname =name[0: name.rindex('.')]
#运行一次ffmpeg,获取分辨率
(si, so, se) = os.popen3('cd '+options.workdir+';mkdir -p ffm; rm -f ffm/ffm.txt ; csh -c "(ffmpeg -i '+options.srcd+'/' +name+ ' >& ffm/ffm.txt)"; grep stream ffm/ffm.txt')
t=so.readlines()
ti=0
for line in se.readlines() :
print line
width=0
height=0
reg='''^\s*stream.*,\s*(\d+)x(\d+)(?: \[sar|,)'''
#stream #0.0: video: rv40 / 0x30345652, 1020x572, 23 fps, 23 tbr, 23 tbn, 23 tbc
for line in t:
result = re.compile(reg).findall(line)
for c in result:
print name+' '+c[0] + 'x' + c[1]
width=string.atoi(c[0])
height=string.atoi(c[1])
if name[0:3]=='m2u' and width==720 and height==576:#m2u开头的,宽度是720x576的,是4:3存储16:9的,将其转换为16:9
width=1024
if width==0:
print 'error parsing width and height'
exit()
vc=''
qstr=''
astr=''
vpre=''
s=''
if options.maxwidth!='':
if width>string.atoi(options.maxwidth):
height = height * string.atoi(options.maxwidth) / width
width = string.atoi(options.maxwidth)
padstr=''
if options.pad==true:
if height*16/9 - width>10:#宽度不够
padstr=' -vf "pad='+str(height*16/9)+':'+str(height)+':'+str((height*16/9 - width)/2)+':0:black"'
elif width - height*16/9 >10:#高度不够
padstr=' -vf "pad='+str(width)+':'+str(width*9/16)+':0:'+str((width - height*16/9)/2)+':black"'
s=' -s '+str(width)+'x'+str(height)+padstr
print 'adjust',s
if options.preset!='':
vpre=' -vpre '+options.preset
if options.an==true:
astr=' -an'
elif options.ogg==true:
astr=' -acodec libvorbis -ar 44100 -ab 64k'
elif options.mp3==true:
astr=' -acodec libmp3lame -ar 44100 -ab 64k'
else:
astr=' -acodec libfaac -ar 44100 -ab 64k'
if options.vcodec=='vp8':
vc='libvpx'
qstr=" -qmin "+options.q+" -qmax "+options.q
elif options.vcodec=='x264':
vc='libx264'
qstr=" -crf "+options.q
elif options.vcodec=='xvid':
vc='libxvid'
qstr=" -qmin "+options.q+" -qmax "+options.q
cmd ='csh -c "' + "cd "+options.workdir+";touch ffm/output.log;(ffmpeg -y -i "+options.srcd+"/"+name+astr+" -vcodec "+vc+vpre+qstr+s+" -r 25 -threads 8 "+options.targetd+"/"+newname+"."+options.filetype + ' >>& ffm/output.log)"'
print cmd
#运行
(si, so, se) = os.popen3(cmd)
for line in se.readlines() :#打印输出
print line
for line in so.readlines() :#打印输出
print line
#print cmd,' finish'#再显示一次命令

到此这篇关于python脚本实现音频和视频格式转换的文章就介绍到这了,更多相关python格式转换内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Python批量调整Word文档中的字体、段落间距及格式

03-10

Python文本到语音转换库pyttsx3的安装及使用全面指南

03-10

Python使用PDFMiner.six解析PDF数据详解

03-10

使用Python分割并高效处理PDF大文件详解

03-10

Python调用ollama本地大模型进行批量识别PDF

03-10

Python+tkinter实现动态连接数据库

03-10

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论