OK、これが私がやったことです。私のGoコードは、mp3に変換するffmpegプロセスを介して生のPCMデータをパイプします。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)
}