2014-01-14 1 views
4

Я использовал 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, он хорошо работает, отображается время, воспроизведение видео с нормальной скоростью.

+1

это может произойти, если PTS неверны, посмотрите на то, что делает-genpts! – alexbuisson

+0

@alexbuisson Я использовал '-fflags + genpts', но без помощи – Mustafa

+0

Кажется, он работает на Chromecast по телевизору, но не на самом Chrome, странно. – Mustafa

ответ

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'

+0

Извините, это не помогло – Mustafa

+1

Вот что я использую в локальной системе для потоковой передачи локального файла на сервер wowza. Возможно, вы можете найти некоторые отличия в разбивке своего флага и моей, так как в конечном счете это все еще 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'' – SurfinColin

2

Я подозреваю, что проблема заключается в том факте, что вы не объявляющий AAC аудио кодек (который, вообще говоря, необходимая для совместимых h264 видео). Пример кода на этой GitHub странице делает это явно:

"  .audioCodec('libfaac') " 

Если вы по-прежнему есть проблемы, вы должны открыть вопрос на странице Github:

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

EDIT Вы также не укажите

-profile:v baseline -level 3.0 

, что, вероятно, является причиной того, что он работает на хромоте, а не на хроме.

+0

Добавление его не исправить, проблема связана с видео, он не воспроизводится на обычной скорости, что бы в буфере не было показано. – Mustafa

+0

вы проверили с другим файлом? – denjello

+0

Да, я сделал, нет разницы – Mustafa