Compression Pyaudio:如何压缩音频流
我目前正在用python开发一个VOIP工具,用作客户机服务器,如下所示:Compression Pyaudio:如何压缩音频流,compression,pyaudio,Compression,Pyaudio,我目前正在用python开发一个VOIP工具,用作客户机服务器,如下所示: CHUNK = 1024 p = pyaudio.PyAudio() stream = p.open(format = pyaudio.paInt16, channels = 1, rate = 44100, input = True, frames_per_buffer = CHUNK) while 1: connection.sendVoice
CHUNK = 1024
p = pyaudio.PyAudio()
stream = p.open(format = pyaudio.paInt16,
channels = 1,
rate = 44100,
input = True,
frames_per_buffer = CHUNK)
while 1:
connection.sendVoice(stream.read(CHUNK))
我如何将发送的数据压缩到备用连接,可能会提高速度,…哇,根据我的计算,您是否会在每个环路向套接字连接发送多一点2KB,确切地说是2.0480KB的音频:
(16 * 44.1 / 8) * 1024/44100 = 2.0480
发送更少数据的一个简单方法是,如果将块更改为512
,则减小块的大小。现在,您发送的数据是否比1KB多一点
另一种方法是尝试使用python中的zlib
包来压缩流。通过套接字发送数据后读取数据,但不要忘记在另一端解压。哇,根据我的计算,您是否在套接字连接的每个循环中发送多一点2KB,确切地说是2.0480KB的音频:
(16 * 44.1 / 8) * 1024/44100 = 2.0480
import time, sys,io
import pymedia.audio.sound as sound
import pymedia.audio.acodec as acodec
import pymedia.muxer as muxer
def voiceRecorder( secs, name ):
f = open(name,'wb')
secs = secs*5
dm= muxer.Demuxer('mp3')
snds= sound.getODevices()
rt = 44100
cparams= { 'id': acodec.getCodecID( 'mp3' ),
'bitrate': 128000/4,
'sample_rate': rt,
'channels': 2 }
ac= acodec.Encoder( cparams )
snd= sound.Input( rt, 2, sound.AFMT_S16_LE )
snd.start()
start_time = time.time()
while snd.getPosition()<= secs:
s= snd.getData()
if s and len( s ):
for fr in ac.encode( s ):
f.write( fr)
else:
time.sleep(.25)
snd.stop()
if __name__ == "__main__":
if len( sys.argv )!= 3:
print 'Usage: voice_recorder <seconds> <file_name>'
else:
voiceRecorder( int( sys.argv[ 1 ] ), sys.argv[ 2 ] )
发送更少数据的一个简单方法是,如果将块更改为512
,则减小块的大小。现在,您发送的数据是否比1KB多一点
另一种方法是尝试使用python中的zlib
包压缩流。通过套接字发送数据后读取数据,但不要忘记在另一端解压。导入时间、系统、io
import time, sys,io
import pymedia.audio.sound as sound
import pymedia.audio.acodec as acodec
import pymedia.muxer as muxer
def voiceRecorder( secs, name ):
f = open(name,'wb')
secs = secs*5
dm= muxer.Demuxer('mp3')
snds= sound.getODevices()
rt = 44100
cparams= { 'id': acodec.getCodecID( 'mp3' ),
'bitrate': 128000/4,
'sample_rate': rt,
'channels': 2 }
ac= acodec.Encoder( cparams )
snd= sound.Input( rt, 2, sound.AFMT_S16_LE )
snd.start()
start_time = time.time()
while snd.getPosition()<= secs:
s= snd.getData()
if s and len( s ):
for fr in ac.encode( s ):
f.write( fr)
else:
time.sleep(.25)
snd.stop()
if __name__ == "__main__":
if len( sys.argv )!= 3:
print 'Usage: voice_recorder <seconds> <file_name>'
else:
voiceRecorder( int( sys.argv[ 1 ] ), sys.argv[ 2 ] )
将pymedia.audio.sound导入为声音
将pymedia.audio.acodec导入为acodec
将pymedia.muxer作为muxer导入
def语音记录器(秒,名称):
f=打开(名称“wb”)
秒=秒*5
dm=muxer.Demuxer('mp3')
snds=sound.getODevices()
rt=44100
cparams={'id':acodec.getCodecID('mp3'),
“比特率”:128000/4,
“采样率”:rt,
“通道”:2}
ac=acodec编码器(CPARAM)
snd=声音输入(rt,2,sound.AFMT_S16_LE)
snd.start()
开始时间=time.time()
而snd.getPosition()导入时间、系统、io
将pymedia.audio.sound导入为声音
将pymedia.audio.acodec导入为acodec
将pymedia.muxer作为muxer导入
def语音记录器(秒,名称):
f=打开(名称“wb”)
秒=秒*5
dm=muxer.Demuxer('mp3')
snds=sound.getODevices()
rt=44100
cparams={'id':acodec.getCodecID('mp3'),
“比特率”:128000/4,
“采样率”:rt,
“通道”:2}
ac=acodec编码器(CPARAM)
snd=声音输入(rt,2,sound.AFMT_S16_LE)
snd.start()
开始时间=time.time()
虽然snd.getPosition()发送1024个数据块非常小,但您确实需要压缩??只需说“hello”就可以发送约30000个字符(计算求和len(stream.read(CHUNK))。连续讲话使用0.7 Mbits/秒。您可以降低速率(如速率=1024*10或速率=1024*15等)为了节省尺寸。顺便说一句,我也面临同样的问题。我可以联系吗you@Waroulolz我差不多做完了。希望我能在五点之前给出答案tomorrow@messifan我很想看看你做了什么发送1024个数据块太小了,你真的需要压缩吗?只要说“你好”就可以发送30000个字符(计算求和len(stream.read(CHUNK)).连续讲话使用0.7 Mbit/秒。您可以降低速率(如速率=1024*10或速率=1024*15等)为了节省尺寸。顺便说一句,我也面临同样的问题。我可以联系吗you@Waroulolz我差不多做完了。希望我能在五点之前给出答案tomorrow@messifan我很想看看你都做了些什么并不想知道我每个循环发送了多少,但我发送了多少来获取完整的单词/句子/…所以块并不重要。录制“Hello”发送的512个区块比2048个区块多,但两个区块发送的比特总数相同。zlib的thx。它正在以约20-30%的降低率完成这项工作。不想知道每个循环发送多少,但我为完整的单词/句子/发送多少…所以区块并不重要。录制“Hello”将发送比2048块更多的512块,但两者发送的zlib的bits.thx总数相同。它正在以约20-30%的减少率进行工作。您也可以使用lame dll(使用ctype)要做到这一点。如果你可以发布你的电子邮件,我也可以向你发送该邮件的代码。我还有播放区块的代码。请立即删除你的电子邮件。我将使用ctype发送iTunes,以降低windows的可移植性(?)所以我不是很感兴趣,但是读区块会很好。所以我认为上面的方法更好,选择它,发送一个回来!客户端服务器有一个难听的噪音:(你也可以使用lame dll(使用ctype)要做到这一点。如果你可以发布你的电子邮件,我也可以向你发送该邮件的代码。我还有播放区块的代码。请立即删除你的电子邮件。我将使用ctype发送iTunes,以降低windows的可移植性(?)所以我不是很感兴趣,但是读区块会很棒。所以我认为上面的方法更好,选择它,发送一个回来!客户端服务器有一个难听的噪音:(