用于HTML5 <audio>标记的流式容器

wxs*_*wxs 6 go audio-streaming html5-audio

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

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

我知道一种方法是使用正确的流媒体服务器并通过它转码我的音频,但如果我自己实现这一点,是否有一种相当直接的方法来开始?也许是Go库让这更容易?

谢谢

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

wxs*_*wxs 0

好吧,这就是我最终要做的,我的 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)
}
Run Code Online (Sandbox Code Playgroud)