小能豆

使用 OpenCV python 创建的视频无法上传到社交媒体平台

py

我使用 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()

阅读 11

收藏
2025-01-11

共1个答案

小能豆

"mp4v"代表 H.263、MPEG 4 ASP。您可能听说过 DivX 和 XviD。就是这样。

您的目标网站似乎拒绝该视频格式。

如果您想要 H.264、MPEG 4 AVC,则需要"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 进程)的可执行文件位于同一目录中时,它也应该被拾取。

2025-01-11