总结
最近在写直播项目 目前比较重要的点就是推拉流 自己也去了解了一下
ffmpeg
FFmpeg 是一个开源项目,它提供了一个跨平台的命令行工具,以及一系列用于处理音频和视频数据的库。FFmpeg 能够执行多种任务,包括解封装、转封装、视频和音频的编码和解码、流处理等。它广泛应用于多媒体处理领域,被许多项目和网站推荐使用。
FFmpeg 的主要特点包括:
多平台支持:FFmpeg 可以在多种操作系统上运行,包括 Windows、Mac OS X、Linux 等。
功能丰富:它支持大量的音视频格式,能够进行编码、解码、转码、复用、解复用、滤波、转换、抓取等操作。
命令行工具:FFmpeg 提供了简洁的命令行接口,使得用户能够方便地进行批处理操作。
下载ffmpeg
官网 http://ffmpeg.org/
配置环境变量 添加到系统环境变量中
输入这个ffmpeg -version 出现这个 说明成功
node端
const http = require('http');
const express = require('express');
const socketio = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketio(server);
app.use(express.static('public'))
var spawn = require('child_process').spawn;
spawn('ffmpeg', ['-h']).on('error', function (m) {
console.error("FFMpeg not found in system cli; please install ffmpeg properly or make a softlink to ./!");
process.exit(-1);
});
io.on('connection', function (socket) {
socket.emit('message', 'Hello from mediarecorder-to-rtmp server!');
socket.emit('message', 'Please set rtmp destination before start streaming.');
var ffmpeg_process, feedStream = false;
socket.on('config_rtmpDestination', function (m) {
socket._rtmpDestination = m;
});
socket.on('config_vcodec', function (m) {
socket._vcodec = m;
});
socket.on('start', function (m) {
if (ffmpeg_process || feedStream) {
socket.emit('fatal', 'stream already started.');
return;
}
if (!socket._rtmpDestination) {
socket.emit('fatal', 'no destination given.');
return;
}
var framerate = socket.handshake.query.framespersecond;
var audioBitrate = parseInt(socket.handshake.query.audioBitrate);
var audioEncoding = "64k";
console.log(audioEncoding, audioBitrate);
console.log('framerate on node side', framerate);
var ops = [
'-i', '-',
'-c:v', 'libx264', '-preset', 'veryfast', '-tune', 'zerolatency',
'-c:a', 'aac', '-ar', '44100', '-b:a', '64k',
'-y',
'-use_wallclock_as_timestamps', '1',
'-async', '1',
'-filter_complex', 'aresample=44100',
'-strict', 'experimental',
'-bufsize', '1000',
'-f', 'flv', socket._rtmpDestination
];
ffmpeg_process = spawn('ffmpeg', ops);
ffmpeg_process.stderr.on('data', function (data) {
socket.emit('ffmpeg_stderr', '' + data);
});
ffmpeg_process.on('error', function (err) {
socket.emit('fatal', 'ffmpeg error!' + err);
feedStream = false;
console.log('意外出错',err);
socket.disconnect();
});
ffmpeg_process.on('exit', function (err) {
socket.emit('fatal', 'ffmpeg exit!' + err);
socket.disconnect();
console.log('exit',err);
});
socket.on('binarystream', function (data) {
console.log(data,'48888');
ffmpeg_process.stdin.write(data