一、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');
				//input 文件的路径
  new ffmpeg().input(fs.createReadStream('D:\\node-project\\express\\myapp03\\ffluent\\1.avi'))
        .inputFPS(25)  //输出的帧率
        .noAudio()		//完全禁用音频
        .size("640x?")	//自动设置固定宽度和计算高度
        .aspect('4:3')  //设置输出帧纵横比
        .format('flv')  //输出格式
        // 此处的 /live/camera, camera类似于一个房间的概念, 你可以设置为你想要的名字
        //该地址必须跟媒体流服务器地址相同,否则可能推不上去。
        .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)
    // 此处的 /live/camera, camera类似于一个房间的概念, 你可以设置为你想要的名字,要保存的地址
   .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' ,  //切片 相当于format(hls) 
              // '-segment_time 5',  //每五秒切片一次
                '-hls_time 10',  //每片的长度
           '-hls_list_size 6',//:设置m3u8文件播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5,一般用于直播流,点播文件建议设置成0,即全部保存。
          '-hls_wrap 10'  ///设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.
     .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  输出地址
     .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', '*')
      //静态文件同样存在跨域,所以需要设置一下 optionss
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的使用