Gstreamer rtmpsink 到 Azure 媒体服务实时传递事件
Gstreamer rtmpsink to Azure Media Services live pass through event
我正在尝试使用本地 gstreamer 编码器管道将实时视频广播到 Azure 媒体服务.
使用 videotestsrc
测试管道似乎可以很好地处理以下字符串:
gst-launch-1.0 -e videotestsrc ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency byte-stream=true threads=4 ! flvmux streamable=true ! rtmpsink location='rtmp://xxxx.media.azure.net:1935/live/xxxx/mystream live=true flashver=FMLE/3.0(compatible;FMSc/1.0)'
而且我能够在 Azure AMS 仪表板中观看流的预览。
现在,如果我尝试使用 OpenCV(使用 gstreamer 支持编译)从我的 python 脚本中使用 appsrc
管道,则在预览 window。但是,正在为流创建资产,我可以通过 AMS 服务查看该资产流。
以下 python3 脚本使用自定义构建的 OpenCV 版本 4.0.0,编译了 gstreamer 和 cuda。
import sys
import time
import urllib
import cv2
import numpy as np
from datetime import datetime
TEST_CARD = 'https://upload.wikimedia.org/wikipedia/commons/c/c4/PM5544_with_non-PAL_signals.png'
HEADLINE = 'AZURE LIVE STREAM'
RTMP_SERVER = 'rtmp://xxxx.media.azure.net:1935/live/xxxx/mystream'
GST_PIPE = "appsrc ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency byte-stream=true threads=4 ! flvmux streamable=true ! rtmpsink location='{0} live=true flashver=FMLE/3.0(compatible;FMSc/1.0)' ".format(RTMP_SERVER)
if __name__ == '__main__':
print ('Azure Mediastream tester')
print(sys.version)
print (cv2.getBuildInformation())
imgRequest = urllib.request.urlopen(TEST_CARD)
imgArray = np.asarray(bytearray(imgRequest.read()), dtype=np.uint8)
imgO = cv2.imdecode(imgArray, -1)
h,w,c = imgO.shape
font = cv2.FONT_HERSHEY_PLAIN
line = cv2.LINE_AA
cv2.putText(imgO,HEADLINE,(302,85),font,1,(255,255,255),2,line)
print(HEADLINE)
print ('Showing: {0} at [h:{1},w:{2},c:{3}]'.format(TEST_CARD,h,w,c))
print ('Opening GSTREAM {0}'.format(GST_PIPE))
try:
fcc = cv2.VideoWriter.fourcc ('X','2','6','4')
stream = cv2.VideoWriter(GST_PIPE,fcc,25.0,(w,h))
while True:
currentTime = datetime.now()
img = imgO.copy()
cv2.putText(img,str(currentTime),(283,460),font,1,(255,255,255),1,line)
stream.write(img)
cv2.imshow(HEADLINE,img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
stream.release()
cv2.destroyAllWindows()
print ('DONE')
我在这里错过了什么?
因此,在与 Microsoft 的 Azure Media Services 团队进行广泛对话后,发现 Azure Media Player,需要一个存在音轨以便能够播放。
将 GST_PIPE 更改为:
GST_PIPE = "appsrc ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency byte-stream=true threads=4 ! flvmux name=mux ! rtmpsink location='{0} live=true flashver=FMLE/3.0(compatibble;FMSc/1.0)' audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.".format(RTMP_SERVER)
在我的 Python 代码中,使一切都按预期工作(Azure 门户中的频道预览面板除外(仍然不知道那里发生了什么) ).
我正在尝试使用本地 gstreamer 编码器管道将实时视频广播到 Azure 媒体服务.
使用 videotestsrc
测试管道似乎可以很好地处理以下字符串:
gst-launch-1.0 -e videotestsrc ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency byte-stream=true threads=4 ! flvmux streamable=true ! rtmpsink location='rtmp://xxxx.media.azure.net:1935/live/xxxx/mystream live=true flashver=FMLE/3.0(compatible;FMSc/1.0)'
而且我能够在 Azure AMS 仪表板中观看流的预览。
现在,如果我尝试使用 OpenCV(使用 gstreamer 支持编译)从我的 python 脚本中使用 appsrc
管道,则在预览 window。但是,正在为流创建资产,我可以通过 AMS 服务查看该资产流。
以下 python3 脚本使用自定义构建的 OpenCV 版本 4.0.0,编译了 gstreamer 和 cuda。
import sys
import time
import urllib
import cv2
import numpy as np
from datetime import datetime
TEST_CARD = 'https://upload.wikimedia.org/wikipedia/commons/c/c4/PM5544_with_non-PAL_signals.png'
HEADLINE = 'AZURE LIVE STREAM'
RTMP_SERVER = 'rtmp://xxxx.media.azure.net:1935/live/xxxx/mystream'
GST_PIPE = "appsrc ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency byte-stream=true threads=4 ! flvmux streamable=true ! rtmpsink location='{0} live=true flashver=FMLE/3.0(compatible;FMSc/1.0)' ".format(RTMP_SERVER)
if __name__ == '__main__':
print ('Azure Mediastream tester')
print(sys.version)
print (cv2.getBuildInformation())
imgRequest = urllib.request.urlopen(TEST_CARD)
imgArray = np.asarray(bytearray(imgRequest.read()), dtype=np.uint8)
imgO = cv2.imdecode(imgArray, -1)
h,w,c = imgO.shape
font = cv2.FONT_HERSHEY_PLAIN
line = cv2.LINE_AA
cv2.putText(imgO,HEADLINE,(302,85),font,1,(255,255,255),2,line)
print(HEADLINE)
print ('Showing: {0} at [h:{1},w:{2},c:{3}]'.format(TEST_CARD,h,w,c))
print ('Opening GSTREAM {0}'.format(GST_PIPE))
try:
fcc = cv2.VideoWriter.fourcc ('X','2','6','4')
stream = cv2.VideoWriter(GST_PIPE,fcc,25.0,(w,h))
while True:
currentTime = datetime.now()
img = imgO.copy()
cv2.putText(img,str(currentTime),(283,460),font,1,(255,255,255),1,line)
stream.write(img)
cv2.imshow(HEADLINE,img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
stream.release()
cv2.destroyAllWindows()
print ('DONE')
我在这里错过了什么?
因此,在与 Microsoft 的 Azure Media Services 团队进行广泛对话后,发现 Azure Media Player,需要一个存在音轨以便能够播放。
将 GST_PIPE 更改为:
GST_PIPE = "appsrc ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency byte-stream=true threads=4 ! flvmux name=mux ! rtmpsink location='{0} live=true flashver=FMLE/3.0(compatibble;FMSc/1.0)' audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.".format(RTMP_SERVER)
在我的 Python 代码中,使一切都按预期工作(Azure 门户中的频道预览面板除外(仍然不知道那里发生了什么) ).