首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PyAv生成视频(从图像生成器和音频文件)

用PyAv生成视频(从图像生成器和音频文件)
EN

Stack Overflow用户
提问于 2022-05-28 11:53:08
回答 1查看 821关注 0票数 2

有一个基于python生成器的逻辑,它使用PyAv创建一个固定的声音文件和一个等于长度或1帧长的图像。但是,我希望立即执行这个过程,并且不需要另外调用ffmpeg来实现它。

我知道如何分解声音和视频文件,并通过PyAv对它们进行修改,但是由于系统存储空间不足,我无法保存我试图与最终产品转换的文件的视频副本。

那么,如何mux音频包和视频帧?

代码语言:javascript
复制
import av
import numpy as np

def video_generator(config):
    for _ in range( int(<audio time by second> * config.fps)):
        yield np.zeros((config.height, config.width, 3), dtype = np.uint8)

output = av.open(config.output_file, 'w')
ovstream = output.add_stream('libx264rgb', config.fps)
ovstream.pix_fmt = 'rgb24'
ovstream.width = config.width
ovstream.height = config.height

audio_input = av.open(<input wav>, 'r')
oastream = output.add_stream('mp3')

v_frames = (av.VideoFrame.from_ndarray(img, format='rgb24') for img in video_generator(config))
v_frames = (ovstream.encode(frame) for frame in v_frames)

for img_packet in v_frames:
    output.mux(img_packet)
output.close()
EN

回答 1

Stack Overflow用户

发布于 2022-05-31 05:55:26

代码语言:javascript
复制
...
for img_packet in v_frames:
    output.mux(img_packet)

stream = audio_input.streams.audio[0]
for packet in audio_input.demux((stream,)):
    for frame in packet.decode():
        a_frames = oastream.encode(frame)
        output.mux(a_frames)
output.close()
...

此外,如果出现帧丢失,则在output.mux(ovstream.encode()); output.mux(oastream.encode())之前添加output.close()

https://github.com/PyAV-Org/PyAV/issues/597#issuecomment-575349451

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72415486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档