【问题标题】:Get Video-Duration with avconv via Python通过 Python 使用 avconv 获取视频持续时间
【发布时间】:2015-11-24 12:40:47
【问题描述】:

我需要为 Django 应用程序获取视频的持续时间。所以我必须在python中做到这一点。但我真的是这方面的初学者。如果您能提供帮助,那就太好了。

这是我目前得到的:

import subprocess
task = subprocess.Popen("avconv -i video.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed -r 's/([^\.]*)\..*/\1/'", shell=True, stdout=subprocess.PIPE)
time = task.communicate()[0]
print time

我想用 avconv 解决它,因为我已经在另一个时候使用它了。到目前为止,shell-command 运行良好,并为我提供了如下输出: HH:MM:SS。

但是当我执行 python 代码时,我只是在 shell 上得到一个不可解释的符号。

非常感谢您的帮助!

找到了解决办法。问题是 sed 部分:

import os
import subprocess

task = subprocess.Popen("avconv -i video.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed -e 's/.\{4\}$//'", shell=True, stdout=subprocess.PIPE)
time = task.communicate()[0]
print time

因为都是同一个部分,剪掉最后4个字符就够了。

【问题讨论】:

    标签: python django shell video duration


    【解决方案1】:

    来自 python 文档:

    警告

    使用communicate() 而不是.stdin.write.stdout.read.stderr.read 以避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。

    所以你真的应该使用communicate

    import subprocess
    task = subprocess.Popen("avconv -i video.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed -r 's/([^\.]*)\..*/\1/'", shell=True, stdout=subprocess.PIPE)
    time = task.communicate()[0]
    print time
    

    这样您还可以捕获 stderr 消息(如果有)。

    【讨论】:

    • 谢谢,我也在上面的帖子中更改了它,但它仍然给我一个神秘的输出...
    • 如果视频不存在,它应该给出错误输出,但是没有任何输出......
    • communicate 将返回 2 元素元组,索引 0 为标准输出,1:标准错误,因此任何错误都将在 task.communicate()[1] 上。
    • 现在我明白了,您将所有标准错误重定向到标准输出,然后过滤您正在寻找的数据。在这种情况下,您不会收到任何错误消息,因为它已被 grep 过滤。
    • 你可能不应该在命令行中过滤,而是在 python 中。这将为您提供更大的灵活性和处理更多数据的能力,也可以区分错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2022-11-10
    • 2019-04-19
    • 2017-01-19
    相关资源
    最近更新 更多