【问题标题】:Streaming container for HTML5 <audio> tagHTML5 <audio> 标签的流媒体容器
【发布时间】:2013-02-20 06:35:46
【问题描述】:

我有一个 Go 应用程序,我想在其中将实时未压缩音频流式传输到浏览器。我希望通过让浏览器打开与流对应的 URL,然后将音频数据提供给该连接来通过 HTTP 流式传输。

我打算使用 WAV 发送未压缩的数据,但是 WAV 文件格式要求在标题中预定义文件大小。有没有更好的容器格式来进行这种流式传输,我可以在 Go 中轻松使用?

我知道一种方法是使用适当的流媒体服务器并通过它对我的音频进行转码,但如果我自己实现这一点,是否有一种相当简单的方法可以开始?也许一个 Go 库可以让这更容易?

谢谢

编辑我已经通过 ffmpeg 解决了这个问题,如下面的回答中所述

【问题讨论】:

  • 围绕开源 libvorbis 库编写一个包装器,并用它对您的流进行编码。也许有人已经做了包装,搜索互联网。
  • 如果您自己解决了问题,请为您自己的问题添加答案并将其标记为已接受的答案。这样其他有同样问题的人就可以很容易地看到解决方案。
  • 好的,我现在已经接受了自己的答案

标签: go audio-streaming html5-audio


【解决方案1】:

如果您仍在考虑使用未压缩的 WAV 以获得最终质量,那么我认为您有两个选择

  1. 位于标题中 - 说 WAV 很长(说是 2GB)
  2. 将其他块添加到 RIFF 容器中

第一个选择很容易实现,但意味着天真的浏览器会尝试下载 2GB 的文件而不是流式传输它。我希望任何实现 HTML5 的东西都不会那么幼稚,但我认为你需要尝试一下。

the RIFF spec 其中WAV files are a subset 似乎支持第二种选择,添加额外的块。然后,您可以编写一个 WAV 文件,其中包含多个较短的声音数据块。这应该被 WAV 播放器支持,但可能不是因为 WAV 文件从来没有特别好的标准化,而且很多 players just look for a 44 byte header 不太符合 RIFF!

如果我是你,我会先尝试第一个选项,看看效果如何。

【讨论】:

  • 说谎看起来很……有点不对。尝试使用块添加技术会很有趣,但目前还没有。
【解决方案2】:

好的,这就是我最终要做的事情,我的 Go 代码通过 ffmpeg 进程将原始 PCM 数据通过管道传输,该进程将其转换为 mp3。我假设packets 是我的音频数据出现的通道,response 是 http.ResponseWriter

cmd := exec.Command("ffmpeg", "-v", "verbose", "-f", "u16le", "-ar", "44100", "-ac", "1", "-i", "-", "-f", "mp3", "-")
audioIn, err := cmd.StdinPipe()
if err != nil {
    log.Println("Failed to create stdin pipe")
}
audioOut, err := cmd.StdoutPipe()
if err != nil {
    log.Println("Failed to create stdout pipe")
}
err = cmd.Start()
if err != nil {
    log.Println("Failed to start ffmpeg command, error: ", err)
}
go func() {
    for {
        packet := <-packets
        audioIn.Write(packet.Payload)
    }
}
go func() {
    amount, err := io.Copy(response, audioOut)
    if err != nil {
        log.Println("io copy terminated with an error", err)
    }
    log.Printf("Done copying audio data: %d bytes\n", amount)
}()
err = cmd.Wait()
if err != nil {
    log.Println("ffmpeg command terminated incorrectly", err)
}

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 2014-09-24
    • 2015-05-11
    • 2016-11-04
    • 2013-07-30
    • 2011-06-21
    • 2011-04-18
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多