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

news/2024/10/23 7:23:13/
  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压缩成一个视频【经测试,已经稳定处理】
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()

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

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

视频图片处理常用函数封装:
判断图片是否损坏

    def check_img(self, file):""""""try:with Image.open(file) as image:image.load()except (IOError, OSError):return Falsereturn True

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

    def get_video_duration(self, video_path):""""""try:video = VideoFileClip(video_path)duration = video.durationvideo.close()except BaseException:duration = 0return duration

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

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 + 1for 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_sizefor index, url in enumerate(url_list[flag_num * max_size:max_num]):yield index,url

http://www.ppmy.cn/news/1038667.html

相关文章

软件项目验收测试:验证软件功能与性能的有效手段

软件验收测试是软件产品周期中的最后一个测试活动,因此也叫交付测试。目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。 一、软件项目验收测试的重要性 1、软件项目验收测试是确保软件交付前质量的重要环节。在软件项目开…

Java中的枚举类型

一,什么是枚举 在Java中,枚举(Enumeration)是一种特殊的数据类型,它允许我们定义一个固定数量的常量集合。枚举类型在Java中是通过关键字enum来定义的。每个枚举常量都是枚举类型的实例,它们在枚举类型中以…

将Swift Package构建为通用二进制文件 Universal Binary

将Swift软件包构建为通用二进制文件 因此,在苹果在WWDC 2020期间宣布他们将把Mac从英特尔处理器过渡到苹果硅之后,现在是时候让每个人都准备好他们的软件了。 对大多数人来说,这次过渡可能更容易一些,特别是那些已经在iOS上支持a…

如何发布自己的小程序

小程序的基础内容组件 text&#xff1a; 文本支持长按选中的效果 <text selectable>151535313511</text> rich-text: 把HTML字符串渲染为对应的UI <rich-text nodes"<h1 stylecolor:red;>123</h1>"></rich-text> 小程序的…

Nginx反向代理技巧

跨域 作为一个前端开发者来说不可避免的问题就是跨域&#xff0c;那什么是跨域呢&#xff1f; 跨域&#xff1a;指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是浏览器对javascript施加的安全限制。浏览器的同源策略是指协议&#xff0c;域名…

​亚马逊推出新运输服务,配送时效最长达5天!

亚马逊2023假日高峰期配送费用出炉&#xff01; 亚马逊美国站发布公告称亚马逊配送(FBA)的年度假日高峰配送费将于2023年10月15日至2024年1月14日期间适用&#xff0c;亚马逊的平均配送费仍然比其他主要第三方物流提供商的较慢标准运输方式便宜30%&#xff0c;以下是公告内容&…

Oracle/PL/SQL奇技淫巧之Json转表

在Oracle中&#xff0c;有些时候我们需要在一个json文档中查数据 这个时候我们可以通过JSON_TABLE函数来把 json文档 提取成一张可以执行正常查询操作的表 先看JSON_TABLE函数的基础用法&#xff1a; JSON_TABLE(json_data, $.json_path COLUMNS (column_definitions))其中&a…

打造专属照片分享平台:快速上手Piwigo网页搭建

文章目录 通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo 总结 &#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x…