实现方案:

    使用C语言书写解析MP4文件的方法,编译为wasm,与JS协同用来解析上传的MP4文件,获取视频帧数。

优:体积较小(共30KB)

缺:现在功能相当有限,只实现了MP4获取帧数的功能

网页Demo 获取MP4视频帧数http://vividlipi.gitee.io/gerframecountformp4其他方案:

1.  使用MediaInfo前端解决方案

优:支持多种视频,几乎全部视频信息

缺:体积稍微大一点(3M左右)

2. 使用MP4Box.js方案

优:有simple和all版本可选,根据需要的功能选择不同的版本,simple版本30K左右,all版本200K左右

缺:支持MP4

使用本方案可从仓库下载getMP4FrameCount.js和getMP4FrameCount.wasm后引入项目,使用方法请参看 2.2.1 和 2.2.2

下面介绍项目开发与测试的配置

1. WASM本地环境

初次接触WASM请先按照 开发者引导[1] 搭建本地编译环境,书写helloworld程序。

2. 获取MP4视频帧数

2.1 编译C文件

emcc -O2 -o getMP4FrameCount.js getMP4FrameCount.c -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']"

编译生成文件:

  • getMP4FrameRate.js
  • getMP4FrameRate.wasm

-O2开启优化等级为2级,压缩编译产出文件的大小

2.2 JS中调用C函数

2.2.1 引用JS文件

<script src="./getMP4FrameCount.js"></script>

2.2.2 获取MP4视频帧数

​​​​​​​<input type="file" onchange="handleFile(this)" /><script>function handleFile(e){const file = e.files[0];if (!(file instanceof Blob)) return;const reader = new FileReader();reader.onloadend = evt => {const uint8_t_arr = new Uint8Array(evt.target.result);const uint8_t_ptr = window.Module._malloc(uint8_t_arr.length);window.Module.HEAPU8.set(uint8_t_arr, uint8_t_ptr);var result = window.Module.ccall('getFrameCount', null, [null, null],[uint8_t_ptr, uint8_t_arr.length])window.Module._free(uint8_t_ptr);}reader.readAsArrayBuffer(file);}
</script>

3. 运行查看

  1. 在文件目录启动服务器:emrun --no_browser --port 8080 .
  2. 浏览器打开http://localhost:8080/
  3. 上传一个MP4文件,页面将显示视频帧数

4. 运行测试

4.1 生成测试视频

(测试视频已准备,这里介绍如何生成测试视频,有兴趣可以尝试更多测试视频) resource文件下有一张纯黑色图片:black.png,使用ffmpeg命令生成视频,命令如下

ffmpeg -loop 1 -i black.png -c:v libx264 -t 5 -pix_fmt yuv420p -vf scale=320:240 125.mp4

  • -t 5表示生成一个10s的视频
  • 125.mp4为输出结果文件,可任意指定。此命令生成视频帧率为25fps

4.2 编译文件

4.2.1 编译测试文件

gcc -c test.c

  • -c参数表示不链接

4.2.2 编译功能文件

gcc -c getMP4FrameCount.c -D TEST

  • -c参数表示定义宏,默认定义宏为 1[11]

4.2.3 链接

gcc -o testRun test.o getMP4FrameCount.o

4.3 执行测试

./testRun

root# gcc -c test.c
root# gcc -c getMP4FrameCount.c -D TEST
root# gcc -o testRun test.o getMP4FrameCount.o
root# ./testRunTEST PASS: ../resource/375.mp4TEST PASS: ../resource/125.mp4
root# 

以上命令忽略了切换目录的操作,执行时候需要留意目录下是否有对应的文件

参考链接

  1. WASM中文-开发者引导

  2. 官网-Emscripten安装

  3. 简书-调用C中的自定义方法

  4. StackOverflow-如何在前端传递文件给WASM

  5. 在线查看MP4文件BOX组织

  6. CSDN-从MP4文件获取帧率

  7. 博客园-mp4文件格式解析

  8. MDN-C to WASM

  9. MDN-Compile Exist C to WASM

  10. Emscripting a C library to Wasm

  11. GCC编译 Preprocessor-Options

前端获取视频帧率/帧数相关推荐

  1. ffprobe 获取视频每秒总帧数或视频总帧数及视频总时长

    获取每秒总帧数: ffprobe -v 0 -of csv="p=0" -select_streams V:0 -show_entries stream=r_frame_rate ...

  2. python 摄像头录制帧率_实践:用python实现把视频以帧数输出成连续的多图片

    在处理图像的时候,如果获取了一个视频,想把视频以帧数输出成连续的多图片构成图像数据集. 有人就想问什么软件可以把一段电影视频的每一帧连续自动保存成图片? 其实用很短的python程序就能快速实现该功能 ...

  3. 怎么查看视频的帧率帧数、用Matlab把视频分成一帧帧的图片,再把图片按指定帧率合成视频

    一.把视频分成一帧帧的图片的几种方法 ① obj = VideoReader('E:\工业相机\sp\PIC_0145.MP4');%输入视频位置 numFrames = obj.NumberOfFr ...

  4. 自媒体视频改帧数消重软件 修改视频的md5

             自媒体视频改帧数消重软件 修改视频的md5         视频伪原创是进行短视频引流的积累粉丝.今天的头条新闻特别近推出了一系列政策,鼓励媒体积累和煽动粉丝..        核心 ...

  5. java获取视频第一帧工具类

    java获取视频文件第一帧,为了防止黑画面,此例取第五帧,本例子采用maven形式,可以获取视频的文件大小. 1. pom.xml 添加引用jar包 jdk采用1.8,日志自行添加即可,这里使用的是l ...

  6. Java 视频截取帧数保存为本地图片及删除本地图片

    业务功能实现了通过视频URL截取帧数并保存为图片操作. 通过URL获取视频解析并获取其中某一帧数图片并转换为 base64字符串 并输入到对应位置保存操作,最终删除该保存的临时图片以及临时目录 pub ...

  7. vue 上传视频到腾讯云存储并获取视频第一帧

    官网文档链接:https://cloud.tencent.com/document/product/436/6268 需求 项目里之前上传视频是调后端接口,接口将视频保存到服务器,然后返回视频链接. ...

  8. android 获取视频第一帧作为缩略图

    今天,简单讲讲android里如何获取一个视频文件的第一帧作为缩略图显示在界面上. 之前,我说个最近需要从服务器下载视频文件,但是下载后肯定需要显示视频的缩略图在界面上给用户看,于是想到显示视频的第一 ...

  9. Android之使用MediaMetadataRetriever类获取视频第一帧

    一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类,大家可以 ...

最新文章

  1. 数据分析软件-weka
  2. 独家 | 揭秘2021双11背后的数据库硬核科技
  3. 机器人语言特性探索2-正在发生的趋势
  4. 目标检测系列(八)——CenterNet:Objects as points
  5. Win2003下Exchange2003部署图解之七
  6. python虚拟环境安装的包在哪_如何使用virtualenv引导脚本在虚拟环境中安装python包?...
  7. 公众号文章折叠点击后展开案例_(案例)蜂窝纸板在包装中的应用重型箱
  8. Python自动化测试-正则表达式解析
  9. BM:正在研究NFT新用例
  10. virtualbox vdi复制及移动-转
  11. 重定向和请求转发后面加“return;”语句
  12. 网页中,列表数据的分页加载、自动加载
  13. 英伟达显卡gtx和gt的区别
  14. CC2530之OLED12864程序详解
  15. 利用AWVS进行反制
  16. 使用Python获取键盘的输入
  17. 外贸企业管理系统解决方案丨汇信
  18. 自动控制原理笔记-根轨迹的概念-根轨迹方程
  19. FL Studio21云盘水果FL21版有什么新功能?
  20. linux驱动调试--段错误之oops信息分析

热门文章

  1. 集火全屋智能“后装市场”,真正玩得转的没几个
  2. 红帽 linux 安装gns3,在Arch Linux和Manjaro系统上安装GNS3的方法
  3. 详细分析:摄像头像素为何不是越高越好
  4. Fragment中getContext得到的context从哪来?
  5. base64图片压缩到指定大小
  6. 1、用Keil5开发TM4C123G单片机的软件准备
  7. 什么是交互设计?交互设计是做什么的?
  8. python学习No7
  9. linux atop日志查看,A - atop - 监控Linux系统资源与进程的工具 - 《Linux命令大全搜索工具(旧版)》 - 书栈网 · BookStack...
  10. vue2或者vue3图片上传功能(upload)