首页 > 其他分享 >FFmpeg:FIFO + PIPE

FFmpeg:FIFO + PIPE

时间:2022-10-18 17:23:19浏览次数:35  
标签:feed pipe FFmpeg function FIFO flv PIPE var ffmpeg

FIFO

将某些内容流式传输到stdout管道,即使在临时故障(网络中断)的情况下也继续以实时速率处理流,并尝试无限期地每秒恢复流式传输。

ffmpeg -re -stream_loop -1 -i https://file-examples.com/storage/fe4b4c6261634c76e91986b/2017/04/file_example_MP4_480_1_5MG.mp4 -c:v libx264 -an -f fifo -fifo_format flv -map 0 -drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 pipe:1

通过 Node.js + express 将流发布为 http-flv :

var child = require('child_process');
var events = require('events');
var express = require('express')
var app = express();
var server = require('http').Server(app);
var spawn = child.spawn;
var exec = child.exec;
var Emitters = {}
var firstChunks = {}
var config = {
    port:8001,
    // url:'rtsp://131.95.3.162/axis-media/media.3gp'
    url:'https://file-examples.com/storage/fe4b4c6261634c76e91986b/2017/04/file_example_MP4_480_1_5MG.mp4'
}
var initEmitter = function(feed){
    if(!Emitters[feed]){
        Emitters[feed] = new events.EventEmitter().setMaxListeners(0)
    }
    return Emitters[feed]
}
//hold first chunk of FLV video
var initFirstChunk = function(feed,firstBuffer){
    if(!firstChunks[feed]){
        firstChunks[feed] = firstBuffer
    }
    return firstChunks[feed]
}
console.log('Starting Express Web Server on Port '+config.port)
//start webserver
server.listen(config.port);

//make libraries static
app.use('/libs',express.static(__dirname + '/../../web/libs'));
app.use('/',express.static(__dirname + '/'));

//homepage with video element.
//static file send of index.html
app.get('/', function (req, res) {
    res.sendFile(__dirname + '/index.html');
})

//// FLV over HTTP, this URL goes in the flv.js javascript player
// see ./index.html
app.get(['/flv','/flv/:feed/s.flv'], function (req, res) {
    //default to first feed
    if(!req.params.feed){req.params.feed='1'}
    //get emitter
    req.Emitter = initEmitter(req.params.feed)
    //variable name of contentWriter
    var contentWriter
    //set headers
    res.setHeader('Content-Type', 'video/x-flv');
    res.setHeader('Access-Control-Allow-Origin','*');
    //write first frame on stream
    // res.write(initFirstChunk(1))
    //write new frames as they happen
    req.Emitter.on('data',contentWriter=function(buffer){
        res.write(buffer)
    })
    //remove contentWriter when client leaves
    res.on('close', function () {
        req.Emitter.removeListener('data',contentWriter)
    })
});

//ffmpeg
console.log('Starting FFMPEG')
// var ffmpegString = '-re -stream_loop -1 -i '+config.url+' -c:v libx264 -an -f fifo -fifo_format flv -map 0:v -map 0:a -drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 pipe:1'
var ffmpegString = '-re -stream_loop -1 -i '+config.url+' -c:v libx264 -an -f fifo -fifo_format flv -map 0 -drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 pipe:1'
//var ffmpegString = '-i '+config.url+' -c:v libx264 -preset superfast -tune zerolatency -c:a aac -ar 44100 -f flv pipe:4'
//ffmpegString += ' -f mpegts -c:v mpeg1video -an http://localhost:'+config.port+'/streamIn/2'
if(ffmpegString.indexOf('rtsp://')>-1){
    ffmpegString='-rtsp_transport tcp '+ffmpegString
}
console.log('Executing : ffmpeg '+ffmpegString)
var ffmpeg = spawn('ffmpeg',ffmpegString.split(' '),{stdio:['pipe','pipe','pipe','pipe','pipe']});
ffmpeg.on('close', function (buffer) {
    console.log('ffmpeg died')
})
//// FFMPEG Error Logs
//ffmpeg.stderr.on('data', function (buffer) {
//    console.log(buffer.toString())
//});
//data from pipe:1 output of ffmpeg
ffmpeg.stdio[1].on('data', function (buffer) {
    // initFirstChunk(1,buffer)
    initEmitter(1).emit('data',buffer)
});

标签:feed,pipe,FFmpeg,function,FIFO,flv,PIPE,var,ffmpeg
From: https://www.cnblogs.com/develon/p/16803327.html

相关文章

  • centos7环境下二进制编译安装ffmpeg
    centos7环境下二进制编译安装ffmpeg mkdir-p/usr/local/src/ffmpeg_sourcescd/usr/local/src/ffmpeg_sources#安装nasmcd/usr/local/src/ffmpeg_sourcescurl......
  • 【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
    要使用的FFmpeg命令ffmpeg-list_devicestrue-fdshow-idummy会输出的信息通过正则取出设备名称List<string>videoList=newList<string>();for......
  • FFmpeg中的音频文件的封装格式和编码格式
    1.FFmpeg的音频封装格式的学习MP3是我们在日常生活中最常见的音频格式之一,也是一种音频封装格式。1.1查看ffmpeg支持的封装的格式列表ffmpeg-formats|grepmp31.2ffpl......
  • 实战 | 用Python和MediaPipe搭建一个嗜睡检测系统 (详细步骤 + 源码)
    导读本文将使用Python和MediaPipe搭建一个嗜睡检测系统(包含详细步骤+源码)。背景介绍   疲劳驾驶的危害不堪设想,据了解,21%的交通事故都因此而生,尤其是高速路上,大多......
  • 24_用Qt和FFmpeg实现简单的YUV播放器
    前面文章FFmpeg像素格式转换中我们使用FFmpeg实现了一个像素格式转换工具类,现在我们就可以在Qt中利用QImage很容易的实现一个简单的YUV播放器了。播放器功能很简单,只有播......
  • ffmpeg数据结构学习(AVpacket & AVframe)
     其中的AVBufferRef是一个AVbuffer的指针:图片来源于网络 关于AVframe:音频解码API avcodec_decode_audio4在新版中已废弃,替换为使用更为简单的avcodec_send_packet......
  • 如何编写 Pipeline 脚本
    前言Pipeline编写较为麻烦,为此,DataKit中内置了简单的调试工具,用以辅助大家来编写Pipeline脚本。调试grok和pipeline指定pipeline脚本名称,输入一段文本即可判断......
  • FFmpeg H265解码总结
    背景:项目开发需要,通过TCP协议与视频板进行通信,获取图像数据,对图像数据进行解码后显示。关键词:C#、FFmpeg、FFmpeg.AutoGen.dll、WriteableBitmap、H265、HEVC1.初设计......
  • 【音视频连载-009】第二季 FFmpeg 打造简易播放器
    公众号回复:OpenGL,领取学习资源大礼包音视频学习入门技术文章连载:​​技术开发故事会连载​​​​【音视频连载-001】基础学习篇-SDL介绍以及工程配置​​​​【音视频连载-......
  • DW_div_pipe
    https://www.synopsys.com/dw/buildingblock.phphttps://max.book118.com/html/2018/0204/151848438.shtmhttps://caxapa.ru/thumbs/405687/dw_qrg.pdf无符号操作图:......