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

我已经使用stream-transcoder模块来转换文件使其成为一个stream。 所以文件不存储,它是在飞行中。

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); }); 

它工作的很好,速度很快,但速度太快,audio播放速度相同,但video不考虑帧速率,不pipe从ffmpeg收到什么,都很快地显示出来。 此外,它不显示总时间,我相信这是问题。 我需要以某种方式指定长度,帧率,但我找不到足够的信息。 我以为从ffmpeg收到的stream应该包含这个。 而我无法findHTTP中的相应标题。

以下是这个stream代码转换器模块用于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时,它工作的很好,时间显示,video播放速度正常。

我相信你需要在ffmpeg命令中添加“-re”标志,如同你所描述的那样,从一个文件中stream动。

看看这里指导: FFmpegstream媒体指南

这里是直接ffmpeg命令stream文件到一个位置。

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'

我怀疑问题在于你没有声明AACaudio编解码器(一般来说这是对于兼容的h264video的要求)。 该github页面上的示例代码显式执行此操作:

 " .audioCodec('libfaac') " 

如果你仍然有问题,你应该在Github页面上打开一个问题:

https://github.com/trenskow/stream-transcoder.js/issues

编辑你也没有指定

 -profile:v baseline -level 3.0 

这可能是为什么它在Chromecast而不是Chrome浏览器上工作。