Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compression Pyaudio:如何压缩音频流_Compression_Pyaudio - Fatal编程技术网

Compression Pyaudio:如何压缩音频流

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

我目前正在用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(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的可移植性(?)所以我不是很感兴趣,但是读区块会很棒。所以我认为上面的方法更好,选择它,发送一个回来!客户端服务器有一个难听的噪音:(