我想使用io的BytesIO类来创建数据流,但是如果我通过它通过管道传输大量数据,它将使用大量内存,因此我在询问是否有可能释放“旧”使用的内存我已经读过的数据。
如果io模块无法做到这一点,我愿意接受其他解决方案。
这里是它现在的实现方式:
def __init__():
self.audio: av.container.InputContainer = av.open(
stream, "r", timeout=8, options=options, format="webm"
)
self.audio_stream: av.audio.stream.AudioStream = self.audio.streams.get(
audio=0
)[0]
self.output_buffer: io.BytesIO = io.BytesIO(b"")
self.output_container: av.container.OutputContainer = av.open(
self.output_buffer, "w", format="opus"
)
self.output_stream: av.audio.stream.AudioStream = self.output_container.add_stream(
"libopus", 48000
)
...
def fill(self):
position = 0
for packet in self.audio.demux(self.audio_stream):
packet: av.Packet
position += packet.duration
self.output_buffer.seek(0, 2)
self.output_container.mux_one(packet)
...
# then you can read from the buffer with
b = self.output_buffer.read(bytes_to_read)
# this should be Opus Encoded Audio data in bytes format
谢谢你!
对于仍在阅读的每个人,我都找到了适合我的解决方案。使用python的os模块,您可以创建一个新管道(os.pipe()
),该管道可以为您处理所有这些任务。