【发布时间】:2014-07-13 10:24:47
【问题描述】:
我想让 node.js 将一个超长的音频文件转换为 mp3,第二个数据在 stdout 上可用,node.js 应该将它发送到客户端供他们播放。
我已经编写了以下内容,虽然它可以工作,但 html5 音频/视频标签会一直等到 ffmpeg 100% 完成转码,因为我想在 ffmpeg 做它的事情时开始播放视频。
var ffmpeg = childProcess.spawn('ffmpeg', [
'-i', params.location, //location of the specified media file
'-f', 'mp3',
'pipe:1'
]);
res.writeHead(200, {
'Content-Type': 'audio/mp3'
});
ffmpeg.stdout.pipe(res);
编辑 1:不知道为什么,但如果 params.location 指向一部电影,一切似乎都正常。但是,如果它是一个音频文件,那么 ffmpeg 在 100% 转换之前似乎不会输出到标准输出。
编辑 2:事实证明,由于 mp4 文件不是因果关系 (http://en.wikipedia.org/wiki/Causal_system),因此您无法将 mp4 文件转储到标准输出。因此,如果您使用 webm 它可以工作。只需确保编译带有 webm 支持的 ffmpeg(对于自制软件用户: brew install ffmpeg --with-vpx --with-vorbis )。
我上传了一个 github gist,其中显示了两个发送实时 mp3/webm 转码的函数:https://gist.github.com/cobookman/c1a9856a4588496b021a
【问题讨论】:
-
原来是因为 prams.location 指向一个 mp3 文件。仍然不确定如何让 ffmpeg 以管道传输正在以较低比特率重新转码的 mp3 文件。
-
所以无法弄清楚如何让 ffmpeg 播放得很好,所以我现在使用 lame for * audio->mp3 和 ffmpeg for * video -> webm/h.264。不知道 ffmpeg 有什么问题。
标签: javascript node.js ffmpeg html5-audio audio-streaming