2015-08-30 47 views
0

我需要获取Django应用程序视频的持续时间。所以我将不得不在Python中这样做。但我真的是一个初学者。所以,如果你能提供帮助,那将会很好。通过Python获取avconv视频 - 持续时间

这是我走到这一步:

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命令到目前为止效果很好,给了我一个输出: 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个字符。

回答

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 

这样,你也可以捕获标准错误消息,如果有的话。

+0

谢谢,我也在上面的帖子中改变了它,但它仍然给我一个神秘的外观输出... – Johannes

+0

如果视频不存在,它应该给出一个错误输出,但相反,输出... – Johannes

+0

'communic'将返回2元素元组,在索引0是stdout上,在1:stderror上,所以任何错误都将在'task.communicate()[1]'上。 – GwynBleidD

相关问题