Я использовал stream-transcoder модуль для преобразования файла, который делает его потоком. Таким образом, файл не сохраняется, он находится на ходу.Потоковое преобразование фильма с контейнером mp4 в NodeJS, очень быстрое воспроизведение фильма
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 является immeidately показанного, быстрее. Кроме того, он не показывает общее время, я считаю, что это проблема. Мне нужно как-то указать длину, частоту кадров, но я не смог найти достаточно информации об этом. Я думал, что поток, полученный из 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, он хорошо работает, отображается время, воспроизведение видео с нормальной скоростью.
это может произойти, если PTS неверны, посмотрите на то, что делает-genpts! – alexbuisson
@alexbuisson Я использовал '-fflags + genpts', но без помощи – Mustafa
Кажется, он работает на Chromecast по телевизору, но не на самом Chrome, странно. – Mustafa