gpt4 book ai didi

python - 在Python中将字节从子进程管道传输到类似文件的对象

转载 作者:行者123 更新时间:2023-12-04 23:18:57 24 4
gpt4 key购买 nike

我想在 Python 中完成以下工作。我想调用一个子进程(ffmpeg 在这种情况下,使用 ffmpy3 包装器)并将进程的输出直接通过管道传输到一个类似文件的对象上,该对象可以被另一个函数的 open() 使用。称呼。由于音频和视频数据可能变得非常大,我明确地不想将进程的输出作为一个整体加载到内存中,而只是以缓冲的方式“流式传输”它。这是一些示例代码。

async def convert_and_process(file: FileIO):
ff = ffmpy3.FFmpeg(
inputs={str(file.name): None},
outputs={'pipe:1': '-y -ac 1 -ar 16000 -acodec pcm_s16le -f wav'}
)

stdout: StreamReader = (await ff.run_async(stdout=subprocess.PIPE)).stdout

with wave.open(help_needed, 'rb') as wf:
# do stuff with wave file
pass
Hererun_async 的代码,它只是对 asyncio.create_subprocess_exec() 的简单包装.
我的问题基本上只是转 StreamReaderrun_async() 返回变成一个可以被 wave.open() 使用的类文件对象.此外,这种方法实际上是否不会将所有输出加载到内存中,如 Popen.wait()Popen.communicate()会做?
我在想 os.pipe() 可能有用,但我不确定如何。

最佳答案

如果您的示例是您最终目标的真实表示(以 block 为单位读取音频样本),那么您只需使用 FFmpeg 及其 subprocess.Popen.stdout 就可以更轻松地完成它。 .如果它比使用 wave 更多库来读取内存映射的 .wav 文件,然后请忽略此答案或澄清。
先来个不要脸的插件,如果你愿意试试别的库,我的 ffmpegio 可以做你想做的事。这是一个例子:

import ffmpegio

#audio stream reader
with ffmpegio.open(file,'ra', blocksize=1024, ac=1, ar=16000,
sample_fmt='s16le') as f:
for block in f: # block: [1024xchannels] ndarray
do_your_thing(block)
blocksize参数设置一次检索的样本数(在本例中为 1024 个音频样本)。
这个库还很年轻,如果你有任何问题,请在它的 GitHub 问题板上报告。
其次,如果您更喜欢自己实现它,如果您知道 FFmpeg 输出流格式并且您只需要一个流(我认为在非 Windows 下也可以轻松完成多个流),这实际上是相当简单的。对于上面的示例,请尝试以下操作:
ff = ffmpy3.FFmpeg(
inputs={str(file.name): None},
outputs={'pipe:1': '-y -ac 1 -ar 16000 -acodec pcm_s16le -f s16le'}
)
stdout = (await ff.run_async(stdout=subprocess.PIPE)).stdout

nsamples = 1024 # read 1024 samples
itemsize = 2 # bytes, int16x1channel

while True:
try:
b = stdout.read(nsamples*itemsize)
# you may need to check for len(b)=0 as well, not sure atm
except BrokenPipeError:
break
x = np.frombuffer(b, nsamples, np.int16)
# do stuff with audio samples in x

请注意,我更改了 -f wav-f s16le所以只有原始样本被发送到 stdout .然后 stdout.read(n)wave.readframes(n) 基本相同除了他们的 n的意思。

关于python - 在Python中将字节从子进程管道传输到类似文件的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70917512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com