網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
最近在一臺(tái)部署運(yùn)行了近一年的服務(wù)器上發(fā)現(xiàn)了一個(gè)問(wèn)題,用戶(hù)上傳的視頻文件,在經(jīng)過(guò)一系列的處理后,使用moviepy寫(xiě)文件時(shí),會(huì)消耗非常長(zhǎng)的時(shí)間,同時(shí)還占滿(mǎn)了CPU內(nèi)存資源,使得其他請(qǐng)求無(wú)法處理。
排查問(wèn)題
首先查看后臺(tái)正在運(yùn)行的命令,發(fā)現(xiàn)是ffmpeg正在處理視頻,這是因?yàn)閙oviepy就是基于ffmpeg開(kāi)發(fā)的python庫(kù),因此其中的視頻處理操作的本質(zhì)都是使用ffmpeg。
通過(guò)log分析,處理是卡在了寫(xiě)文件這一步,程序沒(méi)有報(bào)錯(cuò)返回,但由于寫(xiě)文件占滿(mǎn)了全部的CPU資源,因此其他用戶(hù)的請(qǐng)求也無(wú)法處理。此外,因?yàn)橄到y(tǒng)已經(jīng)使用了一年之久,不應(yīng)該會(huì)出現(xiàn)低級(jí)問(wèn)題。因此,我將懷疑點(diǎn)放在了當(dāng)前處理的這一段視頻文件上面。
我將懷疑的視頻文件導(dǎo)出,與其他視頻比較,并沒(méi)有任何區(qū)別。但是用程序處理時(shí),處理時(shí)間遠(yuǎn)大于其他視頻。
確認(rèn)問(wèn)題并解決
moviepy
的write_videofile
方法,在視頻處理部分調(diào)用了ffmpeg_write_video
,我將其中的參數(shù)打印出來(lái)后,發(fā)現(xiàn)幀率fps的異常,默認(rèn)視頻幀率為缺省值,即寫(xiě)出來(lái)的視頻應(yīng)與原始視頻一致。但這一段特殊的視頻,ffmpeg檢測(cè)其幀率竟然為900000!要知道,通常用戶(hù)上傳的視頻幀率都在20-30之間。寫(xiě)一段90萬(wàn)幀的視頻,當(dāng)然會(huì)耗盡CPU資源了。
解決思路是獲取一下原始視頻的幀率,然后在寫(xiě)視頻時(shí)指定該幀率。這里利用了opencv提供的方法。
# 使用opencv獲取視頻的幀率
source_video = cv2.VideoCapture(source_file)
fps = source_video.get(cv2.CAP_PROP_FPS)
# 使用moviepy實(shí)例化視頻
source_video = VideoFileClip(source_file)
# 在寫(xiě)文件時(shí),指定輸出幀率
video.write_videofile(target_file, fps=fps)
# 釋放占用
source_video.close()
這樣寫(xiě)視頻就不會(huì)異常占滿(mǎn)CPU資源了。
原文鏈接:https://blog.csdn.net/nchu_zhangyiqing/article/details/124401228
相關(guān)推薦
- 2022-06-11 Python語(yǔ)法學(xué)習(xí)之進(jìn)程間的通信方式_python
- 2022-07-23 C語(yǔ)言簡(jiǎn)明分析指針與引用的具體用法_C 語(yǔ)言
- 2024-01-12 如何理解 Elasticsearch 中的 Indices、Types、Documents、Fiel
- 2022-12-25 Qt開(kāi)發(fā)之QString類(lèi)的使用教程詳解_C 語(yǔ)言
- 2022-09-25 ORACLE數(shù)據(jù)庫(kù)數(shù)據(jù)泵的導(dǎo)入導(dǎo)出
- 2022-09-14 python?特殊屬性及方法詳細(xì)解析_python
- 2022-12-23 Python?UI自動(dòng)化測(cè)試Web?frame及多窗口切換_python
- 2022-01-04 給所有使用el-table組件特定列添加統(tǒng)一事件及樣式
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支