HTTP заголовок для продолжительности MP4 для HTML 5 видео

Я пытаюсь потоковое видео MP4, как он закодирован с веб-сервера. Я считаю, что использовал соответствующие флаги, но он работает неправильно. Когда я загружаю видео из своего потока и открываю его с помощью VLC, он правильно показывает продолжительность. Поскольку сокет не доступен для поиска, я предполагаю, что он записывает метаданные до конца? Мой браузер Chrome всегда показывает продолжительность 8 секунд. Первые 8 секунд воспроизводятся с нормальной скоростью, но затем кнопка паузы превращается в кнопку воспроизведения, и видео воспроизводится очень быстро, возможно, так же быстро, как и получено. Однако звук воспроизводится с нормальной скоростью. Я пытался!--2--> но это поле только для чтения.

интересно, есть ли в любом случае явно указать продолжительность в заголовках HTTP или каким-либо другим способом? Я не могу найти никаких документов об этом.

ffmpeg -i - -vcodec libx264 -acodec libvo_aacenc -ar 44100 -ac 2 -ab 128000 -f mp4 -movflags frag_keyframe+faststart pipe:1 -fflags +genpts -re -profile baseline -level 30 -preset fast

чтобы закрыть избирателей, которые думают, что это не связано с программированием, я использую его на своем собственном сервере, который я закодировал, и мне нужно установить продолжительность программно через JavaScript или настройку заголовок http. Я считаю, что это может быть связано с заголовками ffmpeg или http, поэтому я разместил его здесь.

app.get("/video/*", function(req,res){
    res.writeHead(200, {
        'Content-Type': 'video/mp4',
    });
    var dir = req.url.split("/").splice(2).join("/");
    var buf = new Buffer(dir, 'base64');
    var src = buf.toString();

    var Transcoder = require('stream-transcoder');
    var stream = fs.createReadStream(src);
    // I added my own flags to this module, they are at below:
    new Transcoder(stream)
        .videoCodec('libx264')
        .audioCodec("libvo_aacenc")
        .sampleRate(44100)
        .channels(2)
        .audioBitrate(128 * 1000)
        .format('mp4')
        .on('finish', function() {
            console.log("finished");
        })
        .stream().pipe(res);
});

функция exec в этом модуле stream-transcoder,

    a.push("-fflags");
    a.push("+genpts");
    a.push("-re");
    a.push("-profile");
    a.push("baseline");
    a.push("-level");
    a.push("30");
    a.push("-preset");
    a.push("fast");
    a.push("-strict");
    a.push("experimental");
    a.push("-frag_duration");
    a.push("" + 2 * (1000 * 1000));
    var child = spawn('ffmpeg', a, {
        cwd: os.tmpdir()
    });

1 ответов


Я считаю Это то, что вам нужно.

документация Mozilla на X-Content-Duration*

* в документации обсуждается формат OGG, но принцип применим и к другим видеоформатам