压缩音频数据的快捷方式?

时间:2016-10-05 18:19:44

标签: python audio encoding compression

我正在尝试构建(通过teamspeak启发)一个通过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()

它在局域网上运行良好,但在WAN中音频非常糟糕。

我认为原始音频不适合voip,我正在寻找一种使用有损算法或编码器(mp3,AAC,ogg)来压缩音频的方法

我尝试过LZMA,但我不需要无损压缩,在我的情况下有损耗得更好。

我有两条规则要遵循:

  1. 程序必须是跨平台的,所以我需要一种以“跨平台”方式压缩/解压缩的方法(在python内部)

  2. 音质应该不错(不低于原价的50%)

1 个答案:

答案 0 :(得分:1)

FFmpeg适用于管道协议,并且相同的功能已移植到ffmpy,因此可以将数据写入stdin并从stdout读取。您可能必须提供一些计时结构以处理同步和适当的缓冲区管理,但我认为没有理由不能使其工作。

ffmpy:using the pipe protocol

使用FFmpeg on a rasberry pi

进行实时音频流式传输