在NodeJS中使用mp4容器流式转换电影,电影播放速度非常快

时间:2014-01-14 17:33:55

标签: node.js video ffmpeg mp4 webm

我使用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时,效果很好,时间显示,视频播放速度正常。

2 个答案:

答案 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的原因。