如何使用 ffmpeg 将相机捕获帧发送到 YouTube 流媒体

问题描述 投票:0回答:1
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 处理相机屏幕,然后将其发送到流媒体。我不知道问题是什么。请帮助我。

python opencv ffmpeg youtube streaming
1个回答
0
投票

我在我的计算机(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"]
© www.soinside.com 2019 - 2024. All rights reserved.