gpt4 book ai didi

python - 如何通过传递文件对象(而不是磁盘上文件的位置)将 ffmpeg 与 Python 一起使用

转载 作者:太空狗 更新时间:2023-10-29 21:44:11 26 4
gpt4 key购买 nike

我正在尝试将 ffmpeg 与 Python 的子进程模块结合使用来转换一些音频文件。我从 URL 获取音频文件,并希望能够将 Python 文件对象传递给 ffmpeg,而不是先将它们保存到磁盘。如果我可以取回文件流而不是让 ffmpeg 将输出保存到文件中,那也很好。

作为引用,这就是我现在正在做的:

tmp = "/dev/shm"
audio_wav_file = requests.get(audio_url)
## ## ##
## This is what I don't want to have to do ##
wavfile = open(tmp+filename, 'wrb')
wavfile.write(audio_wav_file.content)
wavfile.close()
## ## ##
conversion = subprocess.Popen('ffmpeg -i "'+tmp+filename+'" -y "'+tmp+filename_noext+'.flac" 2>&1', shell = True, stdout = subprocess.PIPE).stdout.read()

有人知道怎么做吗?

谢谢!

最佳答案

使用 ffmpeg,您可以使用 - 作为输入/输出文件名,以指示它应该从 stdin 读取数据/写入 stdout。

然后您可以使用Popenstdin/stdout 参数来读取/写入您的数据。

一个例子:

from subprocess import Popen, PIPE

with open("test.avi", "rb") as infile:
p=Popen(["ffmpeg", "-i", "-", "-f", "matroska", "-vcodec", "mpeg4",
"-acodec", "aac", "-strict", "experimental", "-"],
stdin=infile, stdout=PIPE)
while True:
data = p.stdout.read(1024)
if len(data) == 0:
break
# do something with data...
print(data)
print p.wait() # should have finisted anyway

您可以为 stdin 提供一个文件,您也可以使用 PIPE 并直接写入进程输入流 (p.stdin) .或者在您的情况下,您只需使用 wavfile...

请注意,您必须明确指定输出格式和编解码器,因为 ffmpeg 无法像通常那样从文件扩展名中猜测它们。
它只适用于不需要可搜索输出流的混合器,但 flac 应该可以...

关于python - 如何通过传递文件对象(而不是磁盘上文件的位置)将 ffmpeg 与 Python 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10400556/

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