gpt4 book ai didi

python - 当 Flask 文件中的流式响应无法播放时

转载 作者:行者123 更新时间:2023-12-04 22:52:03 27 4
gpt4 key购买 nike

我目前有一个在来自 youtube 的 flv 流上运行 ffmpeg enconder 的功能。

def console(cmd, add_newlines=False):
p = Popen(cmd, shell=True, stdout=PIPE)
while True:
data = p.stdout.readline()
if add_newlines:
data += str('\n')
yield data

p.poll()
if isinstance(p.returncode, int):
if p.returncode > 0:
# return code was non zero, an error?
print 'error:', p.returncode
break

当我运行 ffmpeg 命令并将其输出到文件时,这工作正常。该文件是可播放的。
mp3 = console('ffmpeg -i "%s" -acodec libmp3lame -ar 44100 -f mp3 test.mp3' % video_url, add_newlines=True)

但是当我通过 - 将 ffmpeg 输出到标准输出时而不是 test.mp3 ,并流式传输该响应。文件流正常,大小正确。但不能正确播放。听起来很不稳定,当我检查文件的属性时,它并没有像 test.mp3 那样显示它的数据
@app.route('/test.mp3')
def generate_large_mp3(path):
mp3 = console('ffmpeg -i "%s" -acodec libmp3lame -ar 44100 -f mp3 -' % video_url, add_newlines=True)
return Response(stream_with_context(mp3), mimetype="audio/mpeg3",
headers={"Content-Disposition":
"attachment;filename=test.mp3"})

有什么我想念的吗?

最佳答案

你有几个问题。看来你复制了这个 console从某处发挥作用。主要问题是此功能旨在处理文本输出。您使用 ffmpeg 运行的命令会将二进制原始 mp3 数据转储到标准输出,因此读取该输出就好像它是带有 readlines() 的文本文件一样。不管用。 mp3二进制流中根本不存在行的概念。

我已经改编了你的 console()处理二进制流的函数。这是我的版本:

def console(cmd):
p = Popen(cmd, shell=True, stdout=PIPE)
while True:
data = p.stdout.read()
yield data

p.poll()
if isinstance(p.returncode, int):
if p.returncode > 0:
# return code was non zero, an error?
print 'error:', p.returncode
break

请注意,我已删除所有对换行处理的引用,并替换了 readline()read() .

使用这个版本,我可以让流媒体工作。我希望这有帮助!

编辑:您可以通过调用 read(N) 来强制响应以指定大小的 block 发出。与 N是 block 大小。对于给定的音频比特率,您可以计算持续时间为 5 秒的音频 block 的大小(以字节为单位),然后流式传输 5 秒的 block 。

关于python - 当 Flask 文件中的流式响应无法播放时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34349699/

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