需要更多色彩的
不是代码,而是生活

Python调用ffmpeg视频转码实时获取进度的正确写法

需求是这样的,就是Python调用ffmpeg转码,想要取到ffmpeg命令行实时输出的进度信息,以便做进一步的处理,然而就这样一个小小的需求弄了一天,原因是找遍了网上的例子,说的挺好,但一运行都不是我想要的结果,甚至去看了一个开源库ffmpy,它的实现方式也只能等待ffmpeg编码完成后才能返回信息,不是我要的结果。后来仔细翻阅文档,最终实现。主要是一定要设置bufsize,不然是不能实时的读取到的。

import subprocess as sp

FFMPEG_BIN = "ffmpeg"
input_file = 'input.avi'
output_file = 'output.mp4'

# 转码命令
cmd = [FFMPEG_BIN,
       '-y',
       '-i', input_file,
       '-acodec', 'aac',
       output_file]

# ffmpeg进度信息输出到标准错误流而不是标准输出流,这里将其错误流重定向到child管道中
# 重点是一定要设置bufsize=0,禁用缓冲区,否则信息不能及时输出
# universal_newlines=True将管道输出设为文本模式
child = sp.Popen(cmd, stderr=sp.PIPE, bufsize=0, universal_newlines=True, encoding='utf-8')

# child.poll()判断子进程是否结束
while child.poll() is None:
    line = child.stderr.readline().strip()
    if line:
        # 在此可以获取到ffmpeg每一次的信息输出
        print(line)

# ffmpeg进程结束,关闭流
child.stderr.close()
赞(2) 打赏
未经允许不得转载:代码一线 » Python调用ffmpeg视频转码实时获取进度的正确写法
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就支持一下本站

支付宝扫一扫打赏

微信扫一扫打赏