Ffmpeg 保存斜纹布<;溪流>;将8Khz`mulaw`格式转换为文件

Ffmpeg 保存斜纹布<;溪流>;将8Khz`mulaw`格式转换为文件,ffmpeg,twilio,resampling,Ffmpeg,Twilio,Resampling,有几篇文章解决了这个问题,但我无法成功地回放保存的文件。它通常以半速播放 使用上述问题中接受的答案,我将原始音频和base64解码音频保存在go中: //媒体事件 类型媒体结构{ Track字符串`json:“Track”` Chunk string`json:“Chunk”` 时间戳字符串`json:“时间戳”` 有效负载字符串`json:“有效负载”` } //SaveAudio将升级到websocket的连接并将音频保存到文件 func SaveAudio(w http.Response

有几篇文章解决了这个问题,但我无法成功地回放保存的文件。它通常以半速播放

使用上述问题中接受的答案,我将原始音频和base64解码音频保存在go中:

//媒体事件
类型媒体结构{
Track字符串`json:“Track”`
Chunk string`json:“Chunk”`
时间戳字符串`json:“时间戳”`
有效负载字符串`json:“有效负载”`
}
//SaveAudio将升级到websocket的连接并将音频保存到文件
func SaveAudio(w http.ResponseWriter,r*http.Request){
utility.DebugLogf(“SaveAudio”)
c、 错误:=升级程序。升级(w,r,nil)
如果错误!=零{
log.Print(“升级:”,错误)
返回
}
延迟实用程序。安全关闭(c)
inBuf:=字节.缓冲区{}
循环:=真
for循环==true{
_,消息,错误:=c.ReadMessage()
实用程序。PanicIfErr(err)
decMessage:=TwilioWSSMessage{}
err=json.Unmarshal(message和decMessage)
实用程序。PanicIfErr(err)
开关decMessage.Event{
案例“已连接”:
实用工具.DebugLogf(“已连接%s协议版本:%s”,decMessage.protocol,decMessage.version)
案例“开始”:
utility.DebugLogf(“启动音频流:%#v”,decMessage.Start)
案例“媒体”:
chunk,err:=base64.StdEncoding.DecodeString(decMessage.Media.Payload)
实用程序。PanicIfErr(err)
_,err=inBuf.Write(块)
实用程序。PanicIfErr(err)
案例“停止”:
utility.DebugLogf(“结束音频流:%#v”,decMessage.Stop)
循环=错误
违约:
实用工具.LogWarningf(“无法识别的事件类型:%s”,decMessage.event)
循环=错误
}
}
saveRaw(&inBuf)
}
func saveRaw(buf*字节.缓冲区){
rawOut,err:=os.Create(“out.ulaw”)
实用程序。PanicIfErr(err)
_,err=rawOut.Write(buf.Bytes())
实用程序。PanicIfErr(err)
}
然后我使用
ffmpeg
mulaw
转换为默认的
pcm_s16le

ffmpeg-f mulaw-ar 8000-ac 1-i out.ulaw mulaw_decoded.wav
然后从8k->16k向上采样音频,并使用vlc播放:

ffmpeg-i mulaw_decoded.wav-ar 16000 upsampled.wav和&vlc upsampled.wav
但它以半速播放

最终,我想在rust或go中完成这一切,但我甚至不能让它仅在本地使用ffmpeg

提前谢谢


上述两个
ffmpeg
操作的输出与建议的sox重采样器相结合:

命令:

ffmpeg-y-loglevel verbose-f mulaw-ar 8000-ac 1-bits\u per\u raw\u sample 8-i testsamples/raw\u mulaw\u bytes-af aresample=resampler=soxr-ar 16000 upsampled.wav
输出:

[mulaw@0x7fecc0814000]根据比特率估计持续时间,这可能不准确
输入流的猜测通道布局#0.0:mono
输入#0,mulaw,来自“testsamples/raw#mulaw#u bytes”:
持续时间:00:00:20.74,比特率:64 kb/s
流#0:0:音频:pcm模拟,8000 Hz,单声道,s16,64 kb/s
流映射:
流#0:0->#0:0(pcm#mulaw(本机)->pcm#s16le(本机))
按[q]停止,按[?]获取帮助
[graph_0_in_0_0@0x7FECC050600]tb:1/8000样本Fmt:s16采样器:8000 chlayout:0x4
[Parsed_aresample_0@0x7FECC055280]通道:1通道:单声道fmt:s16 r:8000Hz->通道:1通道:单声道fmt:s16 r:16000Hz
输出#0,wav,至“upsampled.wav”:
元数据:
ISFT:Lavf58.29.100
流#0:0:音频:pcm#u s16le([1][0][0][0]/0x0001),16000 Hz,单声道,s16,256 kb/s
元数据:
编码器:Lavc58.54.100 pcm_s16le
没有更多要写入的输出流,正在完成。
大小=648kB时间=00:00:20.74比特率=256.0kbit/s速度=1.55e+03x
视频:0kB音频:648kB字幕:0kB其他流:0kB全局头:0kB muxing开销:0.011753%
输入文件#0(testsamples/raw#mulaw#u字节):
输入流#0:0(音频):读取519个数据包(165920字节);519帧解码(165920个样本);
总计:519个数据包(165920字节)已解组
输出文件#0(upsampled.wav):
输出流#0:0(音频):200帧编码(33184个样本);200个数据包多路复用(663680字节);
总计:200个数据包(663680字节)多路复用
[AVIOContext@0x7fecc0433cc0]统计:4次查找,6次注销
[AVIOContext@0x7fecc042a6c0]统计信息:读取165920字节,0

音频听起来和以前一样

多亏了这个答案,我终于找到了答案:

他提到:

“慢动作”的另一个可能原因是由同一解码器解码的多个流。但在这种情况下,你也会得到失真的慢速音频

因此,此呼叫的曲目是
入站
出站
,因此在
案例“media”中:
要仅保存一个曲目,请执行以下操作:

如果decMessage.Media.Track==“出站”{
chunk,err:=base64.StdEncoding.DecodeString(decMessage.Media.Payload)
实用程序。PanicIfErr(err)
_,err=outboundBuf.Write(块)
实用程序。PanicIfErr(err)
}

ffmpeg命令的工作原理与预期一致

确实提供了一个解决方案(特别是请参见最后一条注释)?另一方面,请不要以您的方式提问:所述问题与Go和/或WebSocket和/或µ-law编解码器无关:这纯粹是关于试图使用
ffmpeg
对音频文件进行上采样的一个特定问题,所以请像这样提问并像这样标记它。如果/当您在使用Go作为编程语言实现某些东西时遇到问题,请发布一个标有
Go
的单独问题。这个问题不包含编程问题。好的,谢谢你的编辑,不,答案没有解决它。与以下结果相同:
ffmpeg-y-i mulaw\u decoded.wav-af aresample=resampler=soxr-ar 16000 upsampled.wav和&vlc upsampled.wav
-我将ffmpeg输出添加到问题中