python直接调用ffmpeg

ffmpeg是一个强大的开源命令行多媒体处理工具。关于ffmpeg的安装问题,可以看之前发的《ffmpeg的安装和简单使用》。ffmpeg如此强大,那么能不能用python调用并实现它的所有功能呢,答案自然是肯定的。

要实现在python中调用ffmpeg,需要了解一下subprocess模块。简单来说,subprocess模块就相当于一个包壳的命令行,原则上可以在命令行中实现的事情都可以使用subprocess在python中实现。ffmpeg的调用当然不在话下。

最简单的使用:

import subprocess
subprocess.Popen(
    '"D:\python_work\Jamtools/bin/ffmpeg"  -thread_queue_size 16 -f gdigrab -i desktop -vcodec libx264 "D:/图片/视频/Jam_screenrecord/test.mp4" -y', 
    shell=True)

上面的代码实现了python内使用ffmpeg抓屏的功能,主要使用了subprocess的Popen类。

该类第一个参数是要输入的命令,和你在cmd命令行或powershell中输入的完全一样,要用引号括起来(是一个字符串)"D:\python_work\Jamtools/bin/ffmpeg"是我的ffmpeg的路径,如果你已经把ffmpeg添加进了系统环境变量,可以直接用ffmpeg代替;
然后第二个参数shell=True,表示可以在python的命令行中看到输出;

这样写的时候,你会发现一运行就开始录屏了!而且,停止不了??!
别急,我们先复习一下,ffmpeg在普通命令行中是怎么中止的,是直接按键盘上的‘q’键对不对(直接X掉命令行的当我没说( ̄▽ ̄)")。有没有办法在subprocess里实现接受用户输入呢,当然是可以的!

要在subprocess接受用户输入,就需要用到subprocess的PIPE(管道)了,PIPE是什么可以先了解一下,不了解也无所谓(会用就行)。如果说subprocess是一个包壳的命令行,PIPE就相当于这个命令行的输入(键盘)、输出(显示)。

话不多说,直接上代码:

import subprocess
import time

ffmpeger=subprocess.Popen(
    '"D:\python_work\Jamtools/bin/ffmpeg"  -thread_queue_size 16 -f gdigrab -i desktop -vcodec libx264 "D:/图片/视频/Jam_screenrecord/test.mp4" -y', 
    shell=True, stdin=subprocess.PIPE)
    
time.sleep(2)
ffmpeger.stdin.write('q'.encode("GBK"))
ffmpeger.communicate() 

上述代码把Popen类实例化为ffmpeger对象,运行后录屏2秒后,将通过subprocess的PIPE(实例化为stdin)输入q停止录屏。

subprocess的PIPE还可以实现把命令行中的输出读取出来,这在ffmpeg运行分析中非常重要,例如使用ffmpeg列取设备时我们可以用

ffmpeg -list_devices true -f dshow -i dummy 

python直接调用ffmpeg_第1张图片
然后通过它的输出来得知设备名称等。subprocess中可以通过管道的stderr接口获得上图中命令行的输出,分析即可得到设备名称!
例:

ffmpeger=subprocess.Popen(
    '"D:\python_work\Jamtools/bin/ffmpeg" -list_devices true -f dshow -i dummy', 
    shell=True, stdin=subprocess.PIPE,stderr=subprocess.PIPE, encoding='utf-8')
    
relog = ffmpeger.stderr.read()
print(relog)

其中我们通过stderr.read()把输出(格式为字符串)存在relog中,就可以通过普通的字符串分析获取输出内容了。要注意的是,上面的stdin、stderr名称是固定的不能改…

hh教程就到这里了,
顺便说一下,我已经把ffmpeg录屏、格式转换等功能集成到我的小工具Jamtools中了,除了截屏、录屏、还有多种语言翻译、识图、按键录制播放、聊天机器人等功能,软件主体采用python构建,完全免费,欢迎使用(禁止进行贩卖或二次开发)
下载地址

python直接调用ffmpeg_第2张图片
python直接调用ffmpeg_第3张图片
python直接调用ffmpeg_第4张图片

你可能感兴趣的:(python)