管道和 OpenCV 到 FFmpeg,在 Python 中使用音频流 RTMP
Pipe and OpenCV to FFmpeg with audio streaming RTMP in Python
我正在尝试使用音频流式传输 FFmpeg。
我将在下面显示我的代码:
导入模块
import subprocess as sp
创建变量
rtmpUrl = "rtmp://a.rtmp.youtube.com/live2/key"
camera_path = "BigBuckBunny.mp4"
cap = cv.VideoCapture(camera_path)
# Get video information
fps = int(cap.get(cv.CAP_PROP_FPS))
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
命令参数
# ffmpeg command
command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmpUrl]
为 ffmpeg 命令创建子进程
# Pipeline configuration
p = sp.Popen(command, stdin=sp.PIPE)
发送帧到RTMP服务器
# read webcamera
while(cap.isOpened()):
ret, frame = cap.read()
if not ret:
print("Opening camera is failed")
break
# write to pipe
p.stdin.write(frame.tobytes())
我希望你能帮助我通过 FFmpeg over RTMP 直播音频。谢谢!
假设您确实需要为视频使用 OpenCV,您必须像 Gyan 评论的那样将音频直接添加到 FFmpeg,因为 OpenCV 不支持音频。
-re
直播可能需要参数。
为了测试,我将 RTMP URL 从 YouTube 修改为本地主机。
FFplay 子进程用于捕获流(用于测试)。
完整代码示例:
import subprocess as sp
import cv2
#rtmpUrl = "rtmp://a.rtmp.youtube.com/live2/key"
rtmp_url = "rtmp://127.0.0.1:1935/live/test" # Use localhost for testing
camera_path = "BigBuckBunny.mp4"
cap = cv2.VideoCapture(camera_path)
# Get video information
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Start the TCP server first, before the sending client (for testing).
ffplay_process = sp.Popen(['ffplay', '-listen', '1', '-i', rtmp_url]) # Use FFplay sub-process for receiving the RTMP video.
# ffmpeg command
# OpenCV does not support audio.
command = ['ffmpeg',
'-y',
'-re', # '-re' is requiered when streaming in "real-time"
'-f', 'rawvideo',
#'-thread_queue_size', '1024', # May help
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-vn', '-i', camera_path, # Get the audio stream without using OpenCV
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
# '-c:a', 'aac', # Select audio codec
'-bufsize', '64M', # Buffering is probably required
'-f', 'flv',
rtmp_url]
# Pipeline configuration
p = sp.Popen(command, stdin=sp.PIPE)
# read webcamera
while (cap.isOpened()):
ret, frame = cap.read()
if not ret:
print("End of input file")
break
# write to pipe
p.stdin.write(frame.tobytes())
p.stdin.close() # Close stdin pipe
p.wait()
ffplay_process.kill() # Forcefully close FFplay sub-process
我正在尝试使用音频流式传输 FFmpeg。
我将在下面显示我的代码:
导入模块
import subprocess as sp
创建变量
rtmpUrl = "rtmp://a.rtmp.youtube.com/live2/key"
camera_path = "BigBuckBunny.mp4"
cap = cv.VideoCapture(camera_path)
# Get video information
fps = int(cap.get(cv.CAP_PROP_FPS))
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
命令参数
# ffmpeg command
command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmpUrl]
为 ffmpeg 命令创建子进程
# Pipeline configuration
p = sp.Popen(command, stdin=sp.PIPE)
发送帧到RTMP服务器
# read webcamera
while(cap.isOpened()):
ret, frame = cap.read()
if not ret:
print("Opening camera is failed")
break
# write to pipe
p.stdin.write(frame.tobytes())
我希望你能帮助我通过 FFmpeg over RTMP 直播音频。谢谢!
假设您确实需要为视频使用 OpenCV,您必须像 Gyan 评论的那样将音频直接添加到 FFmpeg,因为 OpenCV 不支持音频。
-re
直播可能需要参数。
为了测试,我将 RTMP URL 从 YouTube 修改为本地主机。
FFplay 子进程用于捕获流(用于测试)。
完整代码示例:
import subprocess as sp
import cv2
#rtmpUrl = "rtmp://a.rtmp.youtube.com/live2/key"
rtmp_url = "rtmp://127.0.0.1:1935/live/test" # Use localhost for testing
camera_path = "BigBuckBunny.mp4"
cap = cv2.VideoCapture(camera_path)
# Get video information
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Start the TCP server first, before the sending client (for testing).
ffplay_process = sp.Popen(['ffplay', '-listen', '1', '-i', rtmp_url]) # Use FFplay sub-process for receiving the RTMP video.
# ffmpeg command
# OpenCV does not support audio.
command = ['ffmpeg',
'-y',
'-re', # '-re' is requiered when streaming in "real-time"
'-f', 'rawvideo',
#'-thread_queue_size', '1024', # May help
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-vn', '-i', camera_path, # Get the audio stream without using OpenCV
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
# '-c:a', 'aac', # Select audio codec
'-bufsize', '64M', # Buffering is probably required
'-f', 'flv',
rtmp_url]
# Pipeline configuration
p = sp.Popen(command, stdin=sp.PIPE)
# read webcamera
while (cap.isOpened()):
ret, frame = cap.read()
if not ret:
print("End of input file")
break
# write to pipe
p.stdin.write(frame.tobytes())
p.stdin.close() # Close stdin pipe
p.wait()
ffplay_process.kill() # Forcefully close FFplay sub-process