我使用 Python 脚本中的 OpenCV 将 PIL 格式的图像转换为 MP4 视频。
尽管我可以在制作视频后正常播放它们,但之后无法将它们上传到 Twitter 或 Instagram。
如果在创建视频后,我使用外部视频转换器将创建的 MP4 视频转换为相同的 MP4 视频格式,那么现在可以将其上传到 Twitter 和 Instagram。因此,问题一定与 openCV 的编码格式有关。
我尝试使用不同的编解码器格式而不是“mp4v”,即我在网上找到的任何与 MP4 视频兼容的 fourcc 编码格式,但问题仍然存在。
我还可以尝试在导出设置中更改哪些内容,以便能够直接上传用 openCV 创建的视频?
以下是我使用的示例代码:
import cv2 import numpy as np from PIL import Image as Img #Create a list of PIL images: PILimages = [] for i in range(20): digit = str(i) if i < 10: digit = "0" + digit image = Img.open("animationframes/frame " + digit + ".png") PILimages.append(image) #Convert the PIL image list to OpenCV format: def PILimageGroupToOpenCV(imageGroup): openCVimages = [] for image in imageGroup: opencvImage_ = np.asarray(image) opencvImage_ = cv2.cvtColor(opencvImage_, cv2.COLOR_RGB2BGR) openCVimages.append(opencvImage_) return openCVimages #Save the frames as an MP4 video using openCV: def SavePILimagesToMp4(images,PathAndName,FPS): #Convert the PIL images to numpy and then to OpenCV: openCVimages = PILimageGroupToOpenCV(images) #Create the new video: height,width, layers = openCVimages[0].shape size = (width,height) video = cv2.VideoWriter(PathAndName, cv2.VideoWriter_fourcc(*'mp4v'), FPS, size) #Add the images as frames into the video: for i in range(len(openCVimages)): video.write(openCVimages[i]) video.release()
"mp4v"代表 H.263、MPEG 4 ASP。您可能听说过 DivX 和 XviD。就是这样。
"mp4v"
您的目标网站似乎拒绝该视频格式。
如果您想要 H.264、MPEG 4 AVC,则需要"avc1"改为请求。您也可以尝试请求"VP80"。
"avc1"
"VP80"
OpenCV 通常附带 ffmpeg,但是 ffmpeg 通常不附带H.264的编码器。
它可能支持 OpenH264,这是 Cisco 在其 Github 上提供的。您可以下载该 DLL。确保它是OpenCV 在无法找到 DLL 时要求的确切版本。
Failed to load OpenH264 library: openh264-1.8.0-win64.dll Please check environment and/or download library: https://github.com/cisco/openh264/releases [libopenh264 @ 0000018c889e9c40] Incorrect library version loaded [ERROR:0@0.040] global cap_ffmpeg_impl.hpp:3049 open Could not open codec libopenh264, error: Unspecified error (-22) [ERROR:0@0.040] global cap_ffmpeg_impl.hpp:3066 open VIDEOIO/FFMPEG: Failed to initialize VideoWriter
您需要确保 DLL 位于可以找到的位置。在 Windows 上,有一个用于查找 DLL 的定义算法。不要将其放在不属于它的地方。它不属于 system32 目录。
在我的实验中,我可以将 DLL 放在当前工作目录中,然后它就会被拾取。当它与当前进程(python 进程)的可执行文件位于同一目录中时,它也应该被拾取。