• python+ffmpeg视频转码转格式


    本文转发来自:https://blog.csdn.net/KH_FC/article/details/115771126

    废话

    python目前自己也是在学习当中,对python也不是特别精通,写视频转码这个东西也是自己用的到,所以自己在查阅了一些资料后写的这样一个简单工具,这个工具自己使用就可以了,用到正式环境还是有很多不足的,这个有一些不完善,也希望有懂python的大神可以给完善一下哦。废话不多说了开整。

    方法

    一开始在想自己去写一个视频转码的工具的时候在想是用PHP写还是用python写,最后选择python是因为在PHP中碰壁了,到现在也没能解决那个问题,PHP写完出现的BUG是在大视频转码时会存在请求超时的问题,到现在也没能解决到这个BUG,试过修改PHP配置文件中的请求时间、缓存等等一些方法都没有解决,真的是快疯掉了,后面再想办法搞一下吧,后面就想着看看Python会不会有这个问题,结果真的没这个问题。
    既然是要写思路当然是要考虑怎么去进行视频转码,一开始想的是用Flask框架,最后想想Flask框架最后还是要在网页上访问使用麻烦,不如直接使用windows框直接就转码,直接双击代码搞定多好。最后初步定下来的就是使用python中tkinter模块去弄,直接写一个windows GUI他不香嘛。显示方式有了,后面就是转码了,怎么转码呢?查阅了很多的网站,最后决定采用FFmpeg转码工具,工具选好了后面就是写代码的事情了。后面写的过程中确实又出现了一些问题,就是选用ffmpeg模块还是调用ffmpeg程序呢?本人本身是网络工程师出身,所以对代码很敏感,遇到比较难的就会头疼,我分别查了模块和程序的使用方法,模块我参考的是:【Python】ffmpeg模块处理视频、音频信息这篇文章,说实话写的真不错,就是我看不懂,太深奥了,估计我再学几年python就能看懂了,博主等我哈,千万别删文章。程序我是去官网上看的文档ffmpeg官网,这个倒是挺简单的我倒是能看懂,也发现确实可以进行视频转码,好了有了方法了那后面就是思路了。

    思路

    其实这个思路也是蛮简单的,无非我想要的就是双击我写的python代码就可以直接弹出一个windows窗口,然后我输入原视频地址或者路径,然后输入一个转码后的名字,然后再弄个转码按钮不就直接可以转码了。没问题思路清晰,下面就是直接开整。

    python+tkinter制作窗口

    首先我既然要去弄这个窗口,当然我们得知道tkinter这个模块怎么用,下面我总结了一些简单的用法
    示例

    import tkinter		#导入Tkubter模块
    test = tkinter.Tk()
    test.mainloop()
    

    执行结果:
    在这里插入图片描述
    这样一个简单的windows窗口就有了,tkinter模块用法有很多,这里就不细说了,下面继续说我们的转码。

    首先就是先制作一个windwos窗口然后让我输入一些信息,下面是我写的windows窗口。

    import tkinter as tk	#导入tkinter模块,并起别名为tk
    
    wind=tk.Tk()	#建立顶层控件wind
    wind.geometry("800x400")	#设置窗口大小
    wind.title("视频转码")	#设置窗口标题
    
    title_lab=tk.Label(wind,text="视频转码",font="仿宋 20 bold")	#创建窗格标题内容,字体,颜色
    title_lab.place(x=350,y=30)	#设置标题位置
    
    textlab=tk.Label(wind, text="请输入视频地址:", font="仿宋 20 bold", fg="blue", width=20) #创建表单名字,并设置字体、颜色、大小
    textlab.place(x=0,y=100)	#设置表单名字位置
    text_entry=tk.Entry(wind, width=30,font="仿宋 20 bold")	#建立输入的控件entry,也就是表单
    text_entry.place(x=300,y=100)	#设置控件位置
    
    mzlab=tk.Label(wind, text="请输入新视频名称:", font="仿宋 20 bold",fg="blue", width=18)	#创建表单名字,并设置字体、颜色、大小
    mzlab.place(x=0,y=200)	#设置表单名字位置
    mz_entry=tk.Entry(wind, width=30,bg="white",font="仿宋 20 bold")	#建立输入的控件entry,也就是表单
    mz_entry.place(x=300,y=200)	#设置控件位置
    
    btn=tk.Button(wind,text="提交", font="仿宋 20 bold", fg="blue", width=8)	#设置提交按钮,并设置字体样式、大小
    btn.place(x=350,y=300)	#设置按钮位置
    wind.mainloop()	#窗口的消息循环
    

    最后效果图:
    在这里插入图片描述
    显示写出来了,后面该弄功能了

    ffmpeg转码

    在写功能之前首先得学习ffmpeg怎么用,不然的话功能也写不出来

    1. ffmpeg工具软件

    首先我们需要下载ffmpeg工具,下面是下载地址,下载的速度还算比较快,如果有觉的下载慢的,可以私聊我,我把软件包发给大家或者直接在我的资源里面下载也行
    FFmpeg官网地址: https://www.ffmpeg.org/
    FFmpeg下载地址: https://www.ffmpeg.org/download.html

    2. 使用方法

    语法:

    ffmpeg -i 源文件路径及文件名称 转码后文件路径及名称
    

    示例:

    ffmpeg -i D:	estabc.flv	D:	estabc.mp4
    

    实现就是这么简单,建议大家现在系统命令行中先测试下这个工具,看看能不能达到大家的要求,大家要是想了解ffmpeg的全部用法可以去官网文档上面查看

    python调用ffmpeg

    其实相当简单,只需要在python导入OS模块就可以了,下面直接上代码

    import os
    dir = os.getcwd()	
    #获取当前文件路径,因为我这里把ffmpeg工具放到了代码路径,所以需要获取一下当前路径,这个根据大家实际情况写
    dir2 = '/windows-ffmpeg/x64/ffmpeg.exe'	#ffmpeg具体位置
    ff = dir+dir	#组合路径
    result = eval(repr(ff).replace('\','/'))
    #转换反斜杠为斜杠,因为获取到的路径是反斜杠的,需要转换成斜杠,转换后会发现是双斜杠,所以需要下面再转换下
    ff = result.replace('//','/')	#双斜杠转为但斜杠
    cmd = ff +' -i '+'D:	estabc.flv' +' -c copy ' + 'D:	estabc.mp4'
    #写需要执行的命令
    os.system(cmd)	#执行系统命令,也就是进行转码
    

    OK,执行上面代码直接进行转码,这里需要注意的是路径位置一定要对哦!
    窗口有了,功能有了,那后面就是拼接了

    成果

    废话不多说直接上结果:

    import tkinter as tk
    import os
    
    wind=tk.Tk()	
    wind.geometry("800x400")	
    wind.title("视频转码")	
    
    title_lab=tk.Label(wind,text="视频转码",font="仿宋 20 bold")
    title_lab.place(x=350,y=30)	
    
    textlab=tk.Label(wind, text="请输入视频地址:", font="仿宋 20 bold", fg="blue", width=20)
    textlab.place(x=0,y=100)
    text_entry=tk.Entry(wind, width=30,font="仿宋 20 bold")	
    text_entry.place(x=300,y=100)	
    
    mzlab=tk.Label(wind, text="请输入新视频名称:", font="仿宋 20 bold",fg="blue", width=18)
    mzlab.place(x=0,y=200)
    mz_entry=tk.Entry(wind, width=30,bg="white",font="仿宋 20 bold")
    mz_entry.place(x=300,y=200)
    
    #下面是引用了一个执行转码的方法,并声明执行结果
    def getTextInput():	
    	lianjie = text_entry.get()
    	mz = mz_entry.get()
    	mz = mz + '.mp4'
    	ff = '/windows-ffmpeg/x64/ffmpeg.exe'
    	ff1 = os.getcwd()
    	ff = ff1+ff
    	result = eval(repr(ff).replace('\','/'))
    	ff = result.replace('//','/')
    	cmd = ff +' -i '+lianjie+' -c copy '+mz
    	
    	if os.system(cmd) == 0: 	#判断执行结果并进行转码
    		test1=tk.Tk()	
    		test1.geometry("200x100")	
    		test1.title("")	
    		title_lab=tk.Label(test1,text="视频转码成功",font="仿宋 20 bold")	
    		title_lab.place(x=0,y=0)	
    		test1.mainloop()
    	else:
    		test2=tk.Tk()	
    		test2.geometry("200x100")	
    		test2.title("")	
    		title_lab=tk.Label(test2,text="视频转码失败",font="仿宋 20 bold")	
    		title_lab.place(x=0,y=0)	
    		test2.mainloop()
    
    btn=tk.Button(wind,text="提交", font="仿宋 20 bold", fg="blue", width=8,command=getTextInput)	#将信息提交给上面的getTextInput方法
    btn.place(x=350,y=300)
    wind.mainloop()
    

    双击python文件的话会出现两个窗口,一个是用来输入信息的窗口一个是用来显示报错信息的窗口,这个工具有待完善,希望有会python的大神可以完善下
    在这里插入图片描述
    在这里插入图片描述
    注意:这个工具需要注意的是如果你不想改代码直接用的话,就直接把ffmpeg工具和你的代码文件放到一起,还有如果你不写转码后文件路径默认会保存到存放代码文件的地方
    源代码上传到了我的资源里面,资源地址:https://download.csdn.net/download/KH_FC/16719873

  • 相关阅读:
    大数据和云计算
    关于移动开发的一些讨论(在有些场合,移动就是噱头,胡乱鼓吹是不负责任的)
    软件开发设计中的两个误区
    【转】从底层了解ASP.NET体系结构
    DotNet命名规范参考(转)
    PAD会取代PC吗
    转:关于http server
    AOP 面向方面的编程 Aspect Oriented Programing --第一次听说呢,汗!
    关于字符集(讲的比较清楚的一片字符集科普文章)
    .NET vs JAVA
  • 原文地址:https://www.cnblogs.com/blxt/p/14669524.html
Copyright © 2020-2023  润新知