import subprocess
import cv2
# YouTube streaming settings
YOUTUBE_URL = "rtmp://a.rtmp.youtube.com/live2/"
KEY = "..."
# OpenCV camera setup
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# FFmpeg command for streaming
command = [r"C:\utility\ffmpeg\ffmpeg-2024-02-22-git-76b2bb96b4-full_build\ffmpeg-2024-02-22-git-76b2bb96b4-full_build\bin\ffmpeg.exe",
'-f', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', '640x480',
'-i', '-',
'-ar', '44100',
'-ac', '2',
'-acodec', 'pcm_s16le',
'-f', 's16le',
'-ac', '2',
'-i', 'NUL',
'-acodec', 'aac',
'-ab', '128k',
'-strict', 'experimental',
'-vcodec', 'h264',
'-pix_fmt', 'yuv420p',
'-g', '50',
'-vb', '1000k',
'-profile:v', 'baseline',
'-preset', 'ultrafast',
'-r', '30',
'-f', 'flv',
f"{YOUTUBE_URL}/{KEY}",]
# Open a subprocess with FFmpeg
pipe = subprocess.Popen(command, stdin=subprocess.PIPE)
while True:
# Read a frame from the camera
ret, frame = cap.read()
if not ret:
break
# Display the frame
cv2.imshow('Frame', frame)
cv2.waitKey(1) # Wait for 1ms
# Send the frame through the pipe for streaming
pipe.stdin.write(frame.tobytes())
# Check for 'q' key press to stop streaming
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Release resources
cap.release()
cv2.destroyAllWindows()
我正在尝试使用opencv实现捕获相机屏幕,并通过ffmpeg将该帧传输到YouTube流广播。当我运行此代码时,YouTube 流确实开始。但是,它似乎是黑屏,而不是相机屏幕。我不明白问题出在哪里。
一开始我什至没有开始直播,但我将命令选项更改为各种内容,当我运行代码时,我成功开始直播。传输mp4的参考很多,但是传输实时捕获的参考不多。我将使用 opencv 处理相机屏幕,然后将其发送到流媒体。我不知道问题是什么。请帮助我。
我在我的计算机(Mac)上使用此选项进行了测试,它完美地推送到服务器。我这里没有添加麦克风选项。
command = ["ffmpeg", "-y", "-f", "rawvideo", "-pixel_format", "bgr24", "-video_size", "640x480", "-framerate", "30", "-i", "-","-c:v","libx264","-c:a","aac", "-f", "flv", f"{YOUTUBE_URL}/{KEY}"]
将
-pixel_format
替换为 -pix_fmt
,将 ffmpeg
替换为您的 ffmpeg path for windows
。我的 ffmpeg 有 libx264 视频编解码器。您可以使用您拥有的任何 h264 编解码器。
在松开盖子之前,不要忘记
pipe.stdin.close()
和 pipe.wait()
。
注意:在推送到youtube之前,请先尝试使用此选项将其输出到文件中,只是为了测试视频输出是否完美。
command = ["ffmpeg", "-y", "-f", "rawvideo", "-pixel_format", "bgr24", "-video_size", "640x480", "-framerate", "30", "-i", "-","-c:v","libx264","-c:a","aac", "-f", "mp4", "output.mp4"]