如何解决使用 RTMP 流式传输时,有什么方法可以动态切换分辨率?
我使用 Nginx-http-flv-module 作为 RTMP 服务器构建了 Nginx。我使用 ffmpeg-python 上传流。我已经搜索了很多关于“如何即时切换分辨率”的信息。然而,似乎没有人这样做。
因此,我通过定期重新运行新的 ffmpeg 上传过程进行了测试,同时客户端 (opencv-python) 不断接收数据。 发现分辨率切换成功,但是开关附近的帧经常坏。而且 opencv 有时会在没有任何日志的情况下退出。
有什么办法可以实现吗?
这是我的主播的测试代码:
import cv2
import ffmpeg
if __name__ == "__main__":
cap1 = cv2.VideoCapture("videos/1944x960/video.mp4")
cap2 = cv2.VideoCapture("videos/972x480/video.mp4")
pushing_process = None
count = 0
hr = True
while True:
ret1,frame1 = cap1.read()
ret2,frame2 = cap2.read()
if not ret1 or not ret2:
break
if hr:
if pushing_process is None:
pushing_process = ffmpeg.input("pipe:",format="rawvideo",pix_fmt="bgr24",s=f"{1944}x{960}") \
.output("rtmp://127.0.0.1:1935/myapp/s",pix_fmt="yuv420p",f="flv",vcodec="h264",loglevel="error") \
.global_args("-re").run_async(pipe_stdin=True)
frame = frame1
else:
if pushing_process is None:
pushing_process = ffmpeg.input("pipe:",s=f"{972}x{480}") \
.output("rtmp://127.0.0.1:1935/myapp/s",loglevel="error") \
.global_args("-re").run_async(pipe_stdin=True)
frame = frame2
pushing_process.stdin.write(frame.tobytes())
count += 1
if count == 60:
hr = not hr
pushing_process.stdin.close()
pushing_process.wait()
pushing_process = None
count = 0
pushing_process.stdin.close()
pushing_process.wait()
和客户:
import cv2
if __name__ == "__main__":
cap = cv2.VideoCapture("http://127.0.0.1/live?app=myapp&stream=s")
while True:
ret,frame = cap.read()
if not ret:
break
cv2.imshow("frame",cv2.resize(frame,(1944,960),interpolation=cv2.INTER_CUBIC))
cv2.waitKey(0)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。