
由于我们的甲方客户要开始为我们项目产品上加入私有化的直播,这块不得不又捡起来曾经我们做直播推流的事情了,其实私有化直播一直并不是一件容易的事情,现在大部分市面上的产品是采用了云服务第三方来做支持的,要做私有化并且能满足大量用户其实不是简单的事情。
直播推流技术的核心是将音视频数据从采集端传输到服务器,再分发给观众的过程。主要包含以下几个关键环节:
以下是几种主流直播推流技术的架构图:




架构思路:
核心代码示例:
import cv2
import subprocess as sp
# 视频采集参数
width, height, fps = 640, 480, 25
rtmp_url = "rtmp://localhost:1935/live/stream"
# 开启视频采集
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
cap.set(cv2.CAP_PROP_FPS, fps)
# FFmpeg推流命令
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',
rtmp_url]
# 启动FFmpeg进程
process = sp.Popen(command, stdin=sp.PIPE)
while True:
ret, frame = cap.read()
if not ret:
break
# 处理帧并推流
process.stdin.write(frame.tobytes())
cap.release()
process.stdin.close()
process.wait()
架构思路:
核心代码示例:
import org.bytedeco.javacv.*;
import org.bytedeco.ffmpeg.global.avcodec;
public class JavaStreamer {
public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("video=Integrated Camera");
grabber.setImageWidth(640);
grabber.setImageHeight(480);
grabber.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(
"rtmp://localhost:1935/live/stream",
640, 480);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("flv");
recorder.setFrameRate(25);
recorder.start();
Frame frame;
while ((frame = grabber.grab()) != null) {
recorder.record(frame);
}
recorder.stop();
grabber.stop();
}
}架构思路:
核心代码示例:
const ffmpeg = require('fluent-ffmpeg');
const WebSocket = require('ws');
const fs = require('fs');
// 创建WebSocket服务器
const wss = new WebSocket.Server({ port: 8080 });
// 视频流处理
const streamProcess = ffmpeg()
.input('video=Integrated Camera')
.inputFormat('dshow')
.videoCodec('libx264')
.size('640x480')
.fps(25)
.format('flv')
.output('rtmp://localhost:1935/live/stream')
.on('error', (err) => {
console.log('An error occurred: ' + err.message);
})
.run();
// WebSocket处理
wss.on('connection', (ws) => {
console.log('New client connected');
ws.on('message', (message) => {
console.log('Received: ' + message);
});
ws.on('close', () => {
console.log('Client disconnected');
});
});
以上方案可以实现不依赖第三方服务的私有化直播推流系统,根据实际需求可以选择不同的技术栈组合。对于企业级应用,建议采用混合架构,结合RTMP的低延迟和HLS的兼容性优势。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。