python - 将单个 png 文件转换为 mp4
问题描述
我正在尝试找到一种将单个 png 图像转换为具有指定长度的 mp4 文件的方法。在尝试制作更长(多个小时)的视频时,我发现的解决方案缓慢且不可靠。
这是我目前在 Python 3 中的解决方案:
import os
import cv2
video_name = 'video.avi'
frame = cv2.imread('image.png')
height, width, layers = frame.shape
time = 300
video = cv2.VideoWriter(video_name, 0, 1 / 10, (width,height))
for i in range(int(time / 10)):
video.write(cv2.imread(os.path.join('.', 'image.png')))
video.write(cv2.imread('image.png'))
cv2.destroyAllWindows()
video.release()
基本上相同的图像被多次附加来组成视频,我发现合并非常费力,因此将 fps 设置为 0.1 秒。
这感觉像是错误的方法,所以任何解决方案都值得赞赏
解决方案
你会喜欢 PyAV。它是ffmpeg 库的适当subprocess
包装器,而不是您在随机 python 包中找到的通常的 kludges。
它有一个示例,其中使用自定义演示时间戳而不是固定帧速率编写帧。由于 ffmpeg 没有在他们自己的文档中明确说明这些事情,数学/用法有点模糊。
基本上你设置av.VideoFrame.pts
,就是这样。
https://github.com/PyAV-Org/PyAV/blob/main/examples/numpy/generate_video_with_pts.py
请理解,对于某些视频播放器来说,帧之间的时间异常长的视频可能是一个挑战,至少在尝试寻找而不是顺序播放时是这样。
OpenCV 不是媒体库。它的视频 I/O 功能旨在方便而不灵活。
推荐阅读
- java - 错误:java:无效标志:--add-exports=javafx.graphics/com.sun.javafx.application=ALL-UNNAMED
- python - 在 python dict.get() 中引发异常
- sql-server - 通过 SQL 导入导出向导导出表时缺少目标服务器
- greenplum - 查询从 URL 读取数据
- angularjs - 升级到 Angular/AngularJS 混合应用程序:获取打字稿错误/AngularJS 导入错误
- java - 为什么即使提供了初始容量,我们也不能在将元素添加到第 (n-1) 个索引之前将元素添加到第 n 个索引的列表中
- apache-kafka - 对于 kafka 消费者 jmx 指标,records-lag-max 没有获得价值
- c# - 在同一个画布中创建了一个重复的文本,但第二个不起作用
- office365 - Office 365 Outlook,不接收邮件
- docker - 如何在circleci中传递环境变量而不提交git