Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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
Python 如何使用pyaudio反转音频_Python_Audio_Reverse_Pyaudio - Fatal编程技术网

Python 如何使用pyaudio反转音频

Python 如何使用pyaudio反转音频,python,audio,reverse,pyaudio,Python,Audio,Reverse,Pyaudio,我已经修补了一段时间,试图反转一个简单的wave文件,但没有成功 在(我的)理论中,我只需要通过每次pyaudio回调(1024帧)从文件的相应索引中提取音频数据,反转生成的字符串并播放它,从文件的末尾到开头进行迭代 以下是我的代码(仅pyaudio回调和文件处理,其余部分未涉及示例代码): 导入pyaudio 输入波 导入时间 导入系统 如果len(系统argv)

我已经修补了一段时间,试图反转一个简单的wave文件,但没有成功

在(我的)理论中,我只需要通过每次pyaudio回调(1024帧)从文件的相应索引中提取音频数据,反转生成的字符串并播放它,从文件的末尾到开头进行迭代

以下是我的代码(仅pyaudio回调和文件处理,其余部分未涉及示例代码):

导入pyaudio
输入波
导入时间
导入系统
如果len(系统argv)<2:
打印(“播放波形文件。\n\n用法:%s filename.wav”%sys.argv[0])
系统出口(-1)
索引=40*1024
wf=wave.open(sys.argv[1],'rb')
wf.setpos(索引)
p=pyaudio.pyaudio()
def回调(帧内数据、帧计数、时间信息、状态):
全球指数
数据=wf.readframes(帧计数)
数据=数据[:-1]
索引-=1024
wf.setpos(索引)
返回(数据,pyaudio.paccontinue)
stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
速率=wf.getframerate(),
输出=真,
流(回调=回调)
stream.start_stream()
当stream.u处于活动状态时()
睡眠时间(0.1)
stream.stop_stream()
stream.close()
wf.close()
p、 终止()

我知道当它到达文件开头时会崩溃,但它应该播放40×1024帧的反转音频…

如果要反转的文件足够小,可以放入内存,最好是完全加载它并反转数据,然后流式传输:

import pyaudio
import wave

wavefile_name = 'wavefile.wav'
wf = wave.open(wavefile_name, 'rb')

p = pyaudio.PyAudio()
stream = p.open(format =
                p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output = True)

full_data = []
data = wf.readframes(1024)

while data:    
    full_data.append(data)
    data = wf.readframes(1024)

data = ''.join(full_data)[::-1]

for i in range(0, len(data), 1024):
    stream.write(data[i:i+1024])
但是,如果文件太大,无法放入内存,则需要某种方式将文件向后读取并输入到音响系统中。这是一个完全不同的问题,因为它涉及一些低级I/O编程来处理反向读取


编辑:在看到完整的代码后,我没有看到任何错误。代码在我的计算机中正常运行,但在播放结束时失败。但是,您可以做两件事。首先,您可以转到波文件的末尾,使用以下方法向后播放整个声音:

wf = wave.open(sys.argv[1], 'rb')
index = wf.getnframes() - 1024
wf.setpos(index)
其次,您必须修改回调,以便在查找头超出文件开头时不会失败:

def callback(in_data, frame_count, time_info, status):
    global index
    data = wf.readframes(frame_count)
    data = data[::-1]
    index-=1024
    if index < 0:
        return (data, pyaudio.paAbort)
    else:
        wf.setpos(max(index,0))
        return (data, pyaudio.paContinue)
def回调(输入数据、帧计数、时间信息、状态):
全球指数
数据=wf.readframes(帧计数)
数据=数据[:-1]
索引-=1024
如果指数<0:
返回(数据,pyaudio.paAbort)
其他:
wf.setpos(最大值(索引,0))
返回(数据,pyaudio.paccontinue)

除此之外,它还可以正常工作。

首先谢谢,我将在未来几天内试用您的代码!我通过wf.setpos(索引)设置pos的方法不是基本上是反向文件读取(减少索引)吗?在读了1024帧之后,我通过[:-1]反转它们。我仍然无法理解我做错了什么。我无法尝试你的代码,因为它缺少一些部分。例如,我不知道在哪里使用了回调。你能粘贴完整的代码来检查它吗?从理论上讲,你所做的一切都是可行的。然而,我认为这不会太有效率。不管怎样,只要把你的全部代码发出来,我们会看到的。只是扩展我的答案。也许吧。我尝试了一个来自互联网的示例wav文件,没有问题。你试过使用不同的文件吗?是的,我试过了。仍然没有成功。也尝试了Windows机器,同样的结果。奇怪的是,如果我把它写进一个文件,听起来很好。
def callback(in_data, frame_count, time_info, status):
    global index
    data = wf.readframes(frame_count)
    data = data[::-1]
    index-=1024
    if index < 0:
        return (data, pyaudio.paAbort)
    else:
        wf.setpos(max(index,0))
        return (data, pyaudio.paContinue)