一、node-media-server 媒体流服务器
const NodeMediaServer = require('node-media-server');
const config = {
rtmp: {
port: 1940,
chunk_size: 60000,
gop_cache: true,
ping: 60,
ping_timeout: 30
http: {
port: 8001,
allow_origin: '*'
var nms = new NodeMediaServer(config)
nms.run();
二、fluent-ffmpeg 视频编码解码
const ffmpeg = require('fluent-ffmpeg');
new ffmpeg().input(fs.createReadStream('D:\\node-project\\express\\myapp03\\ffluent\\1.avi'))
.inputFPS(25)
.noAudio()
.size("640x?")
.aspect('4:3')
.format('flv')
.save('rtmp://172.18.2.4:1940/live/livestream99')
.on('start', function (e) {
console.log('stream is start: ' + e)
.on('end', function () {
console.log('ffmpeg is end6666')
console.log('ffmpeg is end')
.on('error', function (err) {
console.log('ffmpeg is error! ' + err)
三、不断写入流数据,生成直播视频(rtmp)
const {Transform} = require('stream');
const upperCase = new Transform({
transform(chunk, encoding, callback) {
this.push(chunk);
callback();
});
setInterval(()=>{
upperCase ('图片')
},1000)
const ffmpeg = require('fluent-ffmpeg');
ffmpeg(upperCase)
.noAudio()
.format('flv')
.size("640x?")
.aspect('4:3')
.format('hls')
.outputFPS(20)
.save('rtmp://172.18.2.4:1940/live/livestream')
.on('start', function (e) {
console.log('stream is start: ' + e)
.on('end', function () {
console.log('ffmpeg is end6666')
console.log('ffmpeg is end')
.on('error', function (err) {
console.log('ffmpeg is error! ' + err)
四、 rstp/rtmp 生成m3u8 m3u8其实就是本地存了一小段视频,能够实现h5秒开
ffmpeg('rtmp://58.200.131.2:1935/livetv/cctv3')
.addOptions([
'-c copy',
'-f hls' ,
'-hls_time 10',
'-hls_list_size 6',
'-hls_wrap 10'
.on('start', function (e) {
console.log('stream is start: ' + e)
.on('end', function () {
console.log('ffmpeg is end6666')
console.log('ffmpeg is end')
.on('error', function (err) {
console.log('ffmpeg is error! ' + err)
.on('progress ', function (progress ) {
console.log('ffmpeg is error! ' + err)
.output('D:\\node-project\\express\\myapp03\\ffmpegtom3u8\\hls\\test.m3u8').run()
五、不断写入的流转m3u8
同理 创建写入流即可
六、express 关于转m3u8跨域问题
const Express = require('express');
const path = require('path');
const body_parser = require('body-parser');
const api = Express();
let options = {
setHeaders: function (res, path, stat) {
res.set('Access-Control-Allow-Origin', '*')
api.use(Express.static(path.join(__dirname, 'public'),options));
xamarin-android-ffmpeg
Xamarin Android FFMpeg绑定
对于Android 6.0及更高版本,请使用Xamarin.Android.MP4Transcoder
从Android 6.0开始,严格禁止text relocations , ffmpeg使用的许多源文件都使用text relocations因此,除非ffmpeg重写大型库并将其替换为替代text relocations否则ffmpeg将永远无法在未来的android构建中运行。 为此,唯一的选择是使用Android的本地Mp4转码器。
MP4Transcoder内部使用 ,请在使用Xam
节点ffmpeg安装程序
独立于平台的二进制安装程序,用于节点项目。 对于应该在多个环境中“正常工作”的工具很有用。
为当前平台安装ffmpeg的二进制文件,并提供路径和版本。 支持Linux,Windows和Mac OS / X。
package.json字段optionalDependencies , cpu和os让我们安装程序仅下载当前平台的二进制文件。 另请参见下面的“安装过程中的警告”。
npm install --save @ffmpeg-installer/ffmpeg
const ffmpeg = require ( '@ffmpeg-installer/f
适用于node.js的流利ffmpeg-API
Fluent-ffmpeg正在寻找新的维护人员,请
该库将ffmpeg的复杂命令行用法抽象为一个流畅,易于使用的node.js模块。 为了能够使用此模块,请确保在系统上安装了 (包括所有必需的编码库,如libmp3lame或libx264)。
这是fluent-ffmpeg 2.x的文档。 您仍然可以在访问fluent-ffmpeg 1.7的代码和文档。
通过npm:
$ npm install fluent-ffmpeg
或作为子模块:
$ git submodule add git://github.com/schaermu/node-fluent-ffmpeg.git vendor/fluent-ffmpeg
您可以在examples文件夹中找到许多用法示例(包括使用和 !的实时流式示例)。
ffmpe
FFmpeg流
节点绑定到ffmpeg命令,公开基于流的API。
注意: ffmpeg必须已安装并且在PATH可用。 您可以通过FFMPEG_PATH环境变量(默认值为ffmpeg )设置自定义ffmpeg路径。
const { Converter } = require ( "ffmpeg-stream" )
const { createReadStream , createWriteStream } = require ( "fs" )
async function convert ( ) {
const converter = new Converter ( )
// get a writable input stream and pipe an image file to it
const converterInput = converter . createI
节点ffmpeg
模块。 该库提供了一组函数和实用程序,用于抽象ffmpeg的命令行用法。 要使用此库,需要已安装ffmpeg(包括所有必需的编码库,如libmp3lame或libx264)
您可以使用安装此模块:
npm install ffmpeg
要开始使用此库,必须将其包含在项目中,然后可以使用回调函数或通过库:
var ffmpeg = require('ffmpeg');
使用回调函数
try {
new ffmpeg ( '/path/to/your_movie.avi' , function ( err , video ) {
if ( ! err ) {
console . log ( 'The video is ready to be processed' ) ;
} else {
console . log ( 'Er
ffmpeg始终是音视频领域绕不过去的一个坎,也是一个特别好的工具。虽然再node库里面有根据ffmpeg编译的库,比如 libav.js和fluent-ffmpeg之类,但是调用原生的ffmpeg应用也是一种方法。
这边先上代码再详解(H264转FLV)
function DecodeH264ByteToFlv(){
//ffmpeg -r 30 -i .\android.264 -c:v libx264 -vcodec copy 'C.flv'
ffmpeg =
背景Node 使用进行 ffmpeg 操作,需要下载并且设置 ffmpeg 路径。会自动下载ffmpeg,但是这个下载的ffmpeg 版本较老。,此版本为ffmpeg 5.x以上。只支持macOS(64位和arm64)、Linux(32位和64位、armhf、arm64)和Windows(32和64位)。ffmpeg的原生命令行较为复杂,而 fluent-ffmpeg 则将这些命令抽象为一个npm包,间接调用ffmpeg。命令查看,一般配合和使用。
本文介绍了如何使用 Node.js、Canvas 和 FFmpeg 实现实时视频流的生成和推送。首先,我们实践了如何生成一个静态视频文件,然后在此基础上实现了实时生成并推送视频流的功能。希望本文对您有所帮助!
https://www.jianshu.com/p/2a824f13b2af使用FFmpeg合并音视频
https://www.jianshu.com/p/2a824f13b2affmpeg混音以及音视频混合处理
http://phpstudy.php.cn/c.php/45618.htmlffmpeg 视频合并 如何保留音频
https://www.cnblogs.com/laie...
通过这个例子,你可以了解到如何使用Node.js和相关技术来构建一个简单的直播应用,并实现实时传输和通信功能。直播技术在互联网领域中得到了广泛的应用,它可以实时传输视频内容给观众,使得用户能够实时观看活动、比赛、教育课程等。我们首先指定要处理的视频文件的路径,并设置输出格式为FLV,并选择适当的视频和音频编解码器。我们还引入了Socket.IO库,并在JavaScript代码中创建了一个与服务器的Socket.IO连接。我们还定义了一个路由,当用户访问根路径时,将返回一个HTML文件。
这个库类似语法糖,本质上就是通过nodejs在终端中执行ffmpeg的命令,它将繁琐的ffmpeg命令进行封装,转化成易于理解的链式调用,让我们不需要花费太多的时间去了解ffmpeg命令中琐碎的细节,只需通过封装好的一些显而易见的方法就可以操作视频转码。服务端搭建完,接下来就等前端连接服务器上的websocket,获取转码后的flv格式数据,然后渲染出来就行了。我们通过flv.js这个库来便捷的实现它。以上基本上实现了业务功能需求,运用到生产环境时,可进一步完善代码细节,测试各种异常情况,增加代码健壮性。
配置环境变量,将/bin目录路径添加到PATH中。
下载node.js的ffmpeg组件,下载地址:https://github.com/damianociarla/node-ffmpeg
下载后解压,通过README看到ffmpeg的使用