一、当前现状背景
近期由于做了几个关于端外跳转到打车和检索页的性能优化项目,考虑到Mac端没有靠谱并且好用的视频分帧工具,于是决定自己基于ffmpeg写一个视频分帧的小工具,以便后续能够对于视频分帧性能测试场景有专属的测试工具,提高该场景的性能测试效率。经过调研发现,Windows端大家都在用一个网上较多人使用的yyb_so_test的视频分帧小工具,而Mac端就没有找到类似的,下面我就自己使用的经验,给大家分享一下,我的Mac端使用的视频分帧小工具!
Windows分帧工具:附件安装包yyb_so_test.zip
二、FFmpeg介绍
FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器,堪称多媒体业界的瑞士军刀。除去部分具备系统软件开发能力的大型公司(Microsoft、Apple等)以及某些著名的音视频技术提供商(Divx、Real等)提供的自有播放器之外,绝大部分第三方开发的播放器都离不开FFMpeg的支持,像Linux桌面环境中的开源播放器VLC、MPlayer,Windows下的KMPlayer、暴风影音以及Android下几乎全部第三方播放器都是基于FFMPEG的。
FFMPEG从功能上划分为几个模块,分别为核心工具(libutils)、媒体格式(libavformat)、编解码(libavcodec)、设备(libavdevice)和后处理(libavfilter, libswscale, libpostproc),分别负责提供公用的功能函数、实现多媒体文件的读包和写包、完成音视频的编解码、管理音视频设备的操作以及进行音视频后处理。
三、分帧工具的使用方法
了解到了ffmpeg的强大,我们就开始写我们的分帧工具吧;
工具全部内容,基于python3:
# -*- coding: UTF-8 -*-
#!/usr/bin/env python3
import sys
import os
import time
import argparse
import numpy as np
import cv2 as cv
import functools
def separate_frame(path1, path2):
video_path = os.path.join(os.getcwd(), path1, path2)
print ("video_path:"+video_path)
if not os.path.exists(video_path):
return
list = os.listdir(video_path)
for file in list:
# print(file)
if file.find("mov") == -1 and file.find("MOV") == -1:
continue
# if file.endswith() != -1:
# continue
# try:
# os.unlink(".DS_Store")
# except Exception as e:
# print("不存在.DS_Store")
# 打开视频
video = cv.VideoCapture(os.path.join(video_path, file))
# 帧速率
rate = video.get(5)
# 视频文件中的帧数
frame_num = video.get(7)
# 视频整体的时间
duration = frame_num / rate
frame_path = os.path.join(video_path, file.split(".")[0])
if not os.path.exists(frame_path):
os.mkdir(frame_path)
time.sleep(2)
frame_path = os.path.join(frame_path)
if not os.path.exists(frame_path):
os.mkdir(frame_path)
# -r 20 表示没秒钟截取 20 张图片,也就是 50 毫秒一张图
cmd = "/Users/yufan/Desktop/python/ffm/ffmpeg -i " + os.path.join(video_path, file) + " -r 20 " + os.path.join(frame_path, "%d.jpg")
ret = os.system(cmd)
# 视频分帧
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='ffmpeg 视频分帧脚本')
parser.add_argument('-p', '--path', default='', help='一级目录名')
parser.add_argument('-p2', '--path2', default='', help='二级目录名')
args = parser.parse_args()
# 使用示例:python3 ffmpegVideoFraming.py -p testPath
separate_frame(args.path, args.path2)
1.首先下载ffmpegVideoFraming.py和ffmpeg到自己的本地文件夹,下方附件自取;
创建一个二级目录/Users/yufan/Desktop/python/ffm放ffmpegVideoFraming.py和ffmpeg两个文件到文件夹中:
2.Pycharm中修改ffmpegVideoFraming.py这个文件到本地路径,找到ffmpeg工具库:
3.-r 20 表示每秒钟截取 20 张图片,也就是 50 毫秒一张图
,也可根据自己的测试标准进行修改,1s=1000ms
4.需要分帧的视频,放到一级目录中/Users/yufan/Desktop/python/
5.这里修改你想要分帧的视频文件,理论上ffmpeg功能是很强大的,几乎可以分帧绝大部分格式的视频文件:
6.运行ffmpegVideoFraming.py,查看是否有报错:
常见的一些报错和解决方案:
(1)缺少依赖库cv:
全部依赖库:
在本地通过命令下载安装依赖库pip3 install opencv-python,解决该问题:
(2)运行权限问题,首次运行时Mac端会弹出类似的权限弹框,此时我们不要担心,只需要几步即可获取权限;
首先,打开「启动台>其它>终端」。
然后,在终端中输入以下代码「sudo spctl --master-disable」后在键盘上按【Enter】键(建议复制代码,因为涉及到空格)。
sudo spctl --master-disable
最后,打开 「系统设置>隐私与安全性」 ,查看是否有 「App Store和被认可的开发者」 的选项。
7.拿到权限后,我们再次运行,看到这些打印就算是运行成功了;
运行完成后,我们再去一级目录下查看分帧后的结果:
打卡文件夹,查看视频分帧图片:
到这mac端的视频分帧工具就全部介绍完了,要是能够再分帧完成后把结果自动统计下来就更好了,如果你有更好更简单的办法,欢迎一起沟通交流,为提升测试效率而努力奋斗!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。