Потоковый конвертированный фильм с контейнером 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.

Другие вопросы по тегам