我想實現一個使用扭曲網絡的MJPEG服務器。其中 通過讀取上游gstreamer進程獲取其數據,該進程本身是 將MJPEG數據寫入TCP端口localhost:9999。我有這樣的事情 現在:蟒蛇扭曲:防止TCP讀取器和網絡資源之間的緩衝
from twisted.internet import reactor, protocol, defer
from twisted.web import server, resource
class MJpegResource(resource.Resource):
def __init__(self, queues):
self.queues = queues
@defer.inlineCallbacks
def deferredRenderer(self, request):
q = defer.DeferredQueue()
self.queues.append([q, request])
while True:
yield q.get()
def render_GET(self, request):
request.setHeader("content-type", 'multipart/x-mixed-replace; boundary=--spionisto')
self.deferredRenderer(request)
return server.NOT_DONE_YET
class JpegStreamReader(protocol.Protocol):
def dataReceived(self, data):
for (q, req) in self.factory.queues:
req.write(data)
q.put('')
root = File('web')
root.putChild('stream.mjpeg', MJpegResource(queues))
factory = protocol.Factory()
factory.protocol = JpegStreamReader
factory.queues = queues
reactor.listenTCP(9999, factory)
site = server.Site(root)
reactor.listenTCP(80, site)
# spawn gstreamer process which writes to port 9999.
# The gstream process is launched using:
# gst-launch-1.0 -v \
# v4l2src device=/dev/video0 \
# ! video/x-raw,framerate=15/1, width=640, height=480 \
# ! jpegenc \
# ! multipartmux boundary=spionisto \
# ! tcpclientsink host=127.0.0.1 port=9999 \
reactor.run()
因此,像:
gstreamer --> JpegStreamReader --> MJpegResource
這工作不錯,但我發現,偶爾,在 瀏覽器的視頻遠遠落後是什麼「活着「(有時候多達30-40秒 )。只要刷新瀏覽器,MJPEG流就會跳回 以「正常」。所以我懷疑JpegStreamReader不能 寫入對應於web.http.Request的TCP套接字的速度要快到 gstreamer正在填充TCP套接字9999,並且在JpegStreamReader的輸入隊列上東西正在緩存 。
由於流應該是「現場」,所以我可以將幀丟到 帶回視頻直播。然而,我不知道如何甚至檢測到 JpegStreamReader落後於等?任何關於如何 使這個管道行爲更像一個實時流的建議?
如果基本上有這樣做的另一個架構,建議 將不勝感激。
非常感謝!我剛剛實施了你的建議,我認爲它應該可以解決我的問題。我一直在玩視頻流一段時間,當內部網絡出現額外的網絡活動時,我會看到預期的丟幀。 最終的解決方案還包括只響應resumeResroducing與一秒延遲。 爲了後代的緣故,我想包括我終於想出的代碼。大會是由我自己將其單獨回答還是將其置於評論中。如果單獨的答案我應該接受這個答案還是這個答案? –