如何在生成视频时在线流式传输视频以及失败的CGI方法

时间:2011-03-08 03:34:59

标签: python video-streaming streaming cgi live-streaming

我有一个可以实时生成视频的程序。现在我想在生成这个视频的同时在线播放。有人知道一个简单的方法吗?

我正在描述一种我尝试过的CGI方法,但是没有用,但请注意我对所有能达到目标的选项持开放态度。我只是想知道是否有人知道为什么我的方法不起作用以及我应该如何解决它

我将内容类型设置为mpeg,并定期在mpeg文件中打印出一大块数据。但视频只能持续很短的时间并停止流式传输。我的代码是这样的(在Python中)。

print "Content-type: video/mpeg"
print
f = open("test2.mpg")
while (True):
    st = f.read(1024*1024)
    sys.stdout.write(st)
    time.sleep(0.5)

虽然这样可行。我真的不明白为什么这两个程序的输出是不同的。但显然我不能使用这种方法,因为我不能等到在读完之前生成整个文件。

print "Content-type: video/mpeg"
print
f = open("test2.mpg")
print f.read()

2 个答案:

答案 0 :(得分:2)

什么类型的文件是test2.mpg

如果它是mpeg4文件,您的方法将无效,因为您将在文件的开头或结尾添加标题。 如果您的文件是mpeg2传输流,那么这应该可以。

答案 1 :(得分:1)

你可能会遇到文件结尾,所以你的循环失败,无论是使用EOFError还是崩溃。如果视频是实时生成的,除非test2.mpg是一个FIFO管道(使用mkfifo创建 - 在这种情况下,你一次只能有一个阅读器) - 从管道读取可能不返回数据,并且你的循环可能运行得比保存视频数据快得多。所以你需要一个策略来处理EOF。

此外,您需要确保在此程序中的sys.stdout.write()行之后以及在其他程序中的视频流之后刷新输出。由于你的循环没有结束条件而且没有输出,并且你可能永远不会写任何数据,可能是在循环的一次迭代之后,某些东西失败了,并且web服务器丢弃了缓冲的数据。

此外,一次读取1MB的常量大小可能会导致延迟问题。为了获得更好的延迟,最好使用更小的尺寸;但是,为了获得更好的质量和吞吐量,您可以使用更大的尺寸。但是,如果生成视频的程序,cgi脚本或网络服务器不是定期刷新,则延迟时间点没有实际意义。

我还建议查看“选择”或“轮询”/ epoll - 这些方法中的任何一种都可以让您更好地控制阅读,并且可以通过睡眠来帮助您解决文件结束问题,直到数据为止可用。如果你发现自己需要睡觉(0.5),你可能最好正确使用select / poll。