使用node-fluent-ffmpeg,Ffmpeg将视频时长发送给客户端

4

我对ffmpeg的世界还很陌生,如果这是一个愚蠢的问题,请原谅我。

我正在使用Node-fluent-ffmpeg模块将视频流转换从avi格式到webm格式,利用FFMPEG实现。

到目前为止一切顺利(可以播放视频),但我在将持续时间传递给播放器时遇到了困难。尽管视频能够播放,但也会出错。

我的代码如下:

var stat = fs.statSync(movie);

var start = 0;
var end = 0;
var range = req.header('Range');
if (range != null) {
start = parseInt(range.slice(range.indexOf('bytes=')+6,
  range.indexOf('-')));
end = parseInt(range.slice(range.indexOf('-')+1,
  range.length));
}
if (isNaN(end) || end == 0) end = stat.size-1;
if (start > end) return;

var duration = (end / 1024) * 8 / 1024;

res.writeHead(206, { // NOTE: a partial http response
    'Connection':'close',
    'Content-Type':'video/webm',
    'Content-Length':end - start,
    'Content-Range':'bytes '+start+'-'+end+'/'+stat.size,
    'Transfer-Encoding':'chunked'
});

var proc = new ffmpeg({ source: movie, nolog: true, priority: 1, timeout:15000})
    .toFormat('webm')
    .addOptions(['-probesize 900000', '-analyzeduration 0', '-minrate 1024k', '-maxrate 1024k', '-bufsize 1835k', '-t '+duration+' -ss'])
    .writeToStream(res, function(retcode, error){
    if (!error){
        console.log('file has been converted succesfully',retcode);
    }else{
        console.log('file conversion error',error);
    }
});

我根据这篇文章:http://delog.wordpress.com/2011/04/25/stream-webm-file-to-chrome-using-node-js/设置了带有开始和结束的标头。

我将秒数计算在名为“duration”的变量中。

FFmpeg 给出的错误信息是:

    file conversion error ffmpeg version N-52458-gaa96439 Copyright (c) 2000-2013 the FFmpeg developers
      built on Apr 24 2013 22:19:32 with gcc 4.8.0 (GCC)
      configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --e
    nable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable
    -libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --ena
    ble-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwola
    me --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enabl
    e-libxvid --enable-zlib
      libavutil      52. 27.101 / 52. 27.101
      libavcodec     55.  6.100 / 55.  6.100
      libavformat    55.  3.100 / 55.  3.100
      libavdevice    55.  0.100 / 55.  0.100
      libavfilter     3. 60.101 /  3. 60.101
      libswscale      2.  2.100 /  2.  2.100
      libswresample   0. 17.102 /  0. 17.102
      libpostproc    52.  3.100 / 52.  3.100
    Input #0, avi, from 'C:/temp/test.avi':
      Metadata:
        encoder         : Nandub v1.0rc2
      Duration: 00:01:09.78, start: 0.000000, bitrate: 1517 kb/s
        Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 640x352, 23.98 tbr, 23.98 tbn, 23.98 tbc
        Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 222 kb/s
    [libvpx @ 0036db20] v1.2.0
    Output #0, webm, to 'pipe:1':
      Metadata:
        encoder         : Lavf55.3.100
        Stream #0:0: Video: vp8, yuv420p, 640x352, q=-1--1, 200 kb/s, 1k tbn, 23.98 tbc
        Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp
    Stream mapping:
      Stream #0:0 -> #0:0 (msmpeg4 -> libvpx)
      Stream #0:1 -> #0:1 (mp3 -> libvorbis)

客户端播放器(即VideoJs)显示文件长度为无限/NaN。
我觉得我已经接近解决方案了,但是由于对这个主题的不熟悉,我无法使其正常工作。如果我在任何方面不清楚,请告诉我。(我有一种模糊解释事物的倾向。)
提前致谢!
[编辑]
我删除了持续时间部分,因为它与问题无关。我检查了客户端的响应头,看到:
 Accept-Ranges:bytes
 Connection:keep-alive
 Content-Length:13232127
 Content-Range:bytes 0-13232127/13232128
 Content-Type:video/webm

为什么客户端收到头部信息中的持续时间,却无法计算出它呢?

2个回答

2
不是答案,但是“how is”是什么意思?
var duration = (end / 1024) * 8 / 1024;

如果您想根据“end”是源文件的字节数,并使用“result”的比特率来计算内容的持续时间,那么这是没有意义的,除非您的源文件也是始终1024 kbps CBR。

要获取持续时间,您需要解析/分析源文件和/或查看其元数据。

此外,ffmpeg报告输出速率为200 kb/s,这似乎不是您想要的。

编辑:

也许您可以使用node-fluent-ffmpeg获取源文件的持续时间,请参见https://github.com/schaermu/node-fluent-ffmpeg#reading-video-metadata


2

我找到了问题所在。我对响应头进行了一些调整,但 ffmpeg 是这个故事中的恶棍。我修复了 MP3 文件的转码,客户端可以解析音频时长。由于 FFMPEG 在转码过程中出现错误,因此元数据没有被正确地写入。


2
你需要改变什么?我正在转码为wav,但是我的最终文件没有持续时间或Content-Length头部,出现了相同的问题。 - Jakemmarsh
嘿@jansmolders86,你能告诉我们你是怎么做到的吗?我也很想自己试试,但是我遇到了错误,ffmpeg不认识“t”或“ss”选项。 - Lukas
嘿@Lukas,当然,请看这里:https://github.com/jansmolders86/mediacenterjs/tree/master/lib/transcoding - jansmolders86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接