Потоковый конвертированный фильм с контейнером mp4 в NodeJS, фильм воспроизводится очень быстро
Я использовал модуль 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 ответа
Я считаю, что вам нужно добавить флаг "-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'
Я подозреваю, что проблема заключается в том факте, что вы не объявляете аудиокодек AAC (что обычно требуется для совместимого видео h264). Пример кода на этой странице github делает это явно:
" .audioCodec('libfaac') "
Если у вас продолжают возникать проблемы, вы должны открыть проблему на странице Github:
https://github.com/trenskow/stream-transcoder.js/issues
РЕДАКТИРОВАТЬ Вы также не указали
-profile:v baseline -level 3.0
Вероятно, поэтому он работает на Chromecast, а не Chrome.