如何从不同文件流式传输视频?
我有一个远程文件夹,里面存放着视频。这些视频正在不断上传。
举个例子:
[1].avi
[2].avi
[3].avi
[4].avi
我想尽可能接近实时地播放这些视频(可以使用rtsp或类似的东西)。
在这种情况下,我可以开始播放视频2,然后是视频3,依此类推……同时检查文件夹是否有更新。
我写了一个Python脚本,可以让我一个接一个地播放这些视频,播放时不会感觉到它们之间的切换,使用的是OpenCV(cv2)。但是我还是不知道怎么实现视频的实时播放。
import numpy as np
import collections
import cv
import os
__FRAMES_PER_SECOND = 10.0
def find_between( s, first, last ):
try:
start = s.index( first ) + len( first )
end = s.index( last, start )
return s[start:end]
except ValueError:
return ""
def play(file):
vidFile = cv.CaptureFromFile(file)
nFrames = int( cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FRAME_COUNT ) )
fps = cv.GetCaptureProperty( vidFile, cv.CV_CAP_PROP_FPS )
waitPerFrameInMillisec = int( 1/__FRAMES_PER_SECOND * 1000/1 )
for f in xrange( nFrames ):
frameImg = cv.QueryFrame( vidFile )
cv.ShowImage( "My Video Window", frameImg )
cv.WaitKey( waitPerFrameInMillisec )
directory = "vids/"
dictFiles = {}
arrFiles = []
for root, dirs, files in os.walk(directory):
#print root
#print dirs
arrFiles = files
for file in arrFiles:
number = find_between(file, "[", "]")
#print "----------",file
dictFiles[number] = file
orderedDictFiles = collections.OrderedDict(sorted(dictFiles.items()))
for file in orderedDictFiles:
play(directory + orderedDictFiles[file])
1 个回答
0
如果你在使用Linux系统,可以利用一个叫做pyinotify
的第三方模块来在视频上传的同时播放它。
下面的代码会在视频文件完全上传后打印出"视频完成: <文件路径>"
。你可以修改这段代码来播放这个视频文件。
源代码
import os, sys
import pyinotify
class VideoComplete(pyinotify.ProcessEvent):
def process_IN_CLOSE_WRITE(self, event):
sys.stdout.write(
'video complete: {}\n'.format(event.pathname)
)
sys.stdout.flush()
def main():
wm = pyinotify.WatchManager()
notifier = pyinotify.Notifier(
wm, default_proc_fun=VideoComplete(),
)
mask = pyinotify.ALL_EVENTS
path = os.path.expanduser('~/Downloads/incoming')
wm.add_watch(path, mask, rec=True, auto_add=True)
notifier.loop()
if __name__=='__main__':
main()
输出结果
video complete: /home/johnm/Downloads/incoming/a.txt