【问题标题】:node.js live streaming ffmpeg stdout to resnode.js 将 ffmpeg 标准输出实时流式传输到 res
【发布时间】: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


【解决方案1】:

我不知道为什么这对您不起作用,因为我的应用程序中的代码几乎完全相同。不同之处在于我使用- 而不是pipe:1 作为输出。试试看。

我建议的另一件事是阅读 FFmpeg 的 stderr,以便您可以查看 FFmpeg 是否有任何奇怪的输出,可以为您提供有关正在发生的事情的线索。

【讨论】:

  • 由于 w/e 的原因,我所拥有的 ffmpeg 版本没有将 stdout 上的音频通过管道/流式传输到 node.js 。因此,我创建了一个 bash 脚本,当调用它时,ffmpeg 将音频转换为 wav,并将其通过管道传输到 libmp3lame。然后 libmp3lame (lame) 将 wav 转换为 mp3,并将其通过管道传输到 stdout。这一切都适用于该设置。要点:gist.github.com/cobookman/c1a9856a4588496b021a
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2021-05-18
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多