【发布时间】:2016-10-05 18:19:44
【问题描述】:
我正在尝试构建(受 teampeak 启发)一个通过 UDP 通信的 voip 程序。
这是我的来源(服务器):
import pyaudio
import socket
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels = CHANNELS,
rate = RATE,
output = True,
frames_per_buffer = CHUNK,
)
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind(("0.0.0.0", 4444))
while True:
soundData, addr = udp.recvfrom(CHUNK * CHANNELS * 2)
stream.write(soundData, CHUNK)
print len(soundData)
udp.close()
客户:
import pyaudio
import socket
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
frames_per_buffer = CHUNK,
)
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
udp.sendto(stream.read(CHUNK), ("127.0.0.1", 4444))
udp.close()
它在 LAN 上运行良好,但在 WAN 中音频非常糟糕。
我认为原始音频不适合 voip,我正在寻找一种使用有损算法或编码器(mp3、AAC、ogg)压缩音频的方法
我尝试了 LZMA,但我不需要无损压缩,在我的情况下有损更好。
我有两条规则要遵守:
程序必须是跨平台的,所以我需要一种“跨平台”的方式来压缩/解压(在python里面)
音频质量应该不错(不低于原始音频的 50%)
【问题讨论】:
-
您知道 WAN 上的音频是否因为带宽限制或压缩/解压缩速度而变差?如果是前者,加速后者可能无济于事。
-
由于带宽限制,WAN 中的音频很糟糕(发送的字节数太大),我的音频尚未压缩,我需要通过压缩/编码减少字节数。
-
因此加快压缩/解压缩的速度并不像在不牺牲太多质量的情况下尽可能地压缩它重要——在这种情况下,我建议您搜索支持 Python 接口的音频编码器(可以打包为两个独立的东西)。找到跨平台的东西将是最大的挑战,因为可能会涉及到基于 C 的扩展。
-
ffmpy 对 osx 和 linux 有好处,但是我如何在不安装的情况下在 windows 中使用它呢?
标签: python audio encoding compression