我使用stream-transcoder模块转换文件使其成为流。所以文件没有存储,它是即时的。
app.get("/video", function(req,res){
res.writeHead(200, {'Content-Type': 'video/mp4'});
var src = "movie.avi";
var Transcoder = require('stream-transcoder');
var stream = fs.createReadStream(src);
new Transcoder(stream)
.maxSize(1280, 720)
.videoCodec('h264')
.videoBitrate(800 * 1000)
.fps(25)
.sampleRate(44100)
.channels(2)
.audioBitrate(128 * 1000)
.format('mp4')
.on('finish', function() {
console.log("finished");
})
.stream().pipe(res);
});
它运行良好,速度快,但速度太快,音频以相同的速度播放,但视频不尊重帧速率,无论从ffmpeg收到的是什么,都可以快速地显示出来。另外,它没有显示总时间,我相信这是问题所在。我需要以某种方式指定长度,帧率,但我找不到足够的信息。我认为从ffmpeg收到的流应该包含它。我在HTTP中找不到相应的标题。
以下是此流转码器模块用于MP4的标志:
[ '-i',
'-',
'-vf',
'scale=min(trunc(1280/hsub)*hsub\\,trunc(a*720/hsub)*hsub):min(trunc(720/vsub)*vsub\\,trunc(1280/a/vsub)*vsub)',
'-vcodec',
'h264',
'-b:v',
800000,
'-r',
25,
'-ar',
44100,
'-ac',
2,
'-ab',
128000,
'-f',
'mp4',
'-movflags',
'frag_keyframe+faststart',
'pipe:1' ]
当我使用VP8编码器和WebM时,效果很好,时间显示,视频播放速度正常。
答案 0 :(得分:2)
我相信你需要添加" -re"当你正在描述的时候从文件中流式传输时标记为ffmpeg命令。
点击此处查看指南:FFmpeg Streaming Guide
这是用于将文件流式传输到某个位置的直接ffmpeg命令。
ffmpeg -re -i 'myfile.mp4' -vcodec libx264 -b:v 950k -r 24 -s 1024x576 -ar 44100 -ac 2 -ab 64k -f flv 'rtmp://mywowzaserver.com/live/mp4:streamName'
答案 1 :(得分:2)
我怀疑问题在于你没有宣布AAC音频编解码器(一般来说,这是合规的h264视频所必需的)。该github页面上的示例代码明确地执行了此操作:
" .audioCodec('libfaac') "
如果您仍然遇到问题,请在Github页面上打开一个问题:
https://github.com/trenskow/stream-transcoder.js/issues
EDIT 你也没有指定
-profile:v baseline -level 3.0
这可能是它适用于chromecast而不是chrome的原因。