ffmpeg将图片压缩成视频过程中的问题记录

  1. 问题描述:服务器集群上在使用如下命令对img_path文件夹下的图片(图片名1.jpg......300.jpg)进行批量合成视频过程中,ffmpeg创建完视频文件后,写入过程中,自动kill,捕获异常为空。
  2. 问题原因:集群pods的内存不够,导致ffmpeg在创建完视频文件后,写入过程中内存不够,ffmpeg自动中断
  3. 解决流程:
    1. 【更换其它库】尝试使用opencv(合成后的视频占用空间太大),moviepy(基于ffmpeg封装的)imagepy等常用包对视频进行合成,经过尝试,所有基于ffmpeg实现的方式都会报相同的错
    2. 【分析推断原因】基于上述现象,推断ffmpeg版本问题,或者ffmpeg环境损坏,所以尝试更新ffmpeg到最新版,使用新的免安装的ffmpeg包
    3. 【测试推断,得到结论】事实证明问题依旧
    4. 【发现真正问题原因】经过反复测试,问题根本原因是集群pods的内存不够,在ffmpeg合成时占用内存较高,经实验,内存4096M进能够支撑同时完成20张左右图片同时压缩成视频
    5. 解决思路:将图片10个为一组,进行拆分下载,下载完,利用ffmpeg将图片合成视频,在本地暂存,删除已经合成过的图片,然后再次重复下载图片--合成视频--删除图片步骤,直至所有图片处理完成后,得到30个左右的视频文件,下一步就是将所有视频文件按照顺序利用ffmpeg压缩成一个视频【经测试,已经稳定处理】
python 复制代码
cmd = ['ffmpeg', '-y', '-framerate', '30', '-i', '{}/%d.jpg'.format(img_path), '-c:v',
               'libx264', '-crf', '25', '-pix_fmt', 'yuv420p', '{}'.format(video_name)]

process = subprocess.Popen(cmd)
process.wait()

下边这个是多个视频合成命令,用其他的,比如管道命令(用一堆|隔开文件名)方式,会导致视频只合并第一个,后续的并不会合并,经测试以下方式可用

python 复制代码
cmd = ['ffmpeg','-f','concat','-safe','0','-i','input.txt','-c','copy','output.mp4']
# 生成 input.txt 文件,包含要拼接的视频文件列表
with open('input.txt', 'w') as f:
    for file in videos_name_list:
        f.write("file '{}'\n".format(file))
# 执行拼接命令
process = subprocess.Popen(cmd)
process.wait()
# 删除临时的 input.txt 文件
try:
    os.remove('input.txt')
except BaseException:
    pass

视频图片处理常用函数封装:

判断图片是否损坏

python 复制代码
    def check_img(self, file):
        """

        """
        try:
            with Image.open(file) as image:
                image.load()
        except (IOError, OSError):
            return False
        return True

判断视频是否损坏,获取视频时长(s)(通过获取视频时长)

python 复制代码
    def get_video_duration(self, video_path):
        """

        """
        try:
            video = VideoFileClip(video_path)
            duration = video.duration
            video.close()
        except BaseException:
            duration = 0
        return duration

对列表(j假设列表中是一堆url)进行切分(按照一定长度),得到切分后的分组数,并获取所有分组内容

python 复制代码
def get_detail(self, url_list):
	# 每一组的最大长度
	max_size = 10
	# 分组数
	total_nums = len(url_list) // max_size if len(url_list) % max_size == 0 else len(url_list) // max_size + 1
	for flag_num in range(total_nums):
		max_num = len(url_list) if (flag_num + 1) * max_size >= len(url_list) else (flag_num + 1) * max_size
		for index, url in enumerate(url_list[flag_num * max_size:max_num]):
			yield index,url
                
相关推荐
m0_726365838 小时前
Ai漫剧系统 几分钟,让AI 把一篇小说变成了一部漫剧成片:从剧本到视频的全流程系统实现
人工智能·语言模型·ai作画·音视频
非凡ghost12 小时前
可拓浏览器:给手机浏览器装上“外挂“!2W+拓展+AI搜索,玩出无限可能!
windows·智能手机·音视频·firefox
美狐美颜SDK开放平台13 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
ai产品老杨15 小时前
深度解析:基于国产化异构计算的 AI 视频管理平台架构——从 GB28181 接入到 NPU 边缘推流的解耦实践
人工智能·架构·音视频
watson_pillow15 小时前
音视频相关基础知识储备入门-字幕
音视频
程序员JerrySUN16 小时前
Jetson边缘嵌入式实战课程第二讲:JetPack 和 SDK Manager 是什么
c语言·开发语言·网络·udp·音视频
happybasic18 小时前
在CMD下使用FFmpeg将.wav文件转换成指定的格式~
ffmpeg
weixin_66818 小时前
NVIDIA VSSVideo Search and Summarization视频搜索与摘要蓝图详尽使用说明与技术报告版本
人工智能·音视频
jiayong2319 小时前
国内外视频/图像大模型与智能体工具平台竞品对比
ai·音视频·agent
视频技术分享20 小时前
技术赋能生态革新:音视频产业开启千亿增长新周期 视频会议成核心增长亮点
音视频