当前位置: 首页 > news >正文

.Net下使用 Geb.Video.FFMPEG 操作视频文件

.Net 下默认没有读写视频的类,要进行视频操作很麻烦,之前用过网上的代码,用的很不爽。AForge.Net 对 ffmpeg 进行了封装,不过它引用的dll有点多,且没提供seek方法,无法跳到指定帧,也有点不爽,俺在 AForge.Net 对FFMPEG 封装的基础上,进行了修改,得到 Geb.Video.FFMPEG 库,现分享出来。

主要功能如下:

l 读取视频文件,获取视频参数;

l 读取帧;

l 查找帧;

l 写入视频文件。

有了这些功能,可以写一个简单的视频播放器了,当然,视频转码之类的也不在话下。在此基础上,视频分析,视频合成,视频编辑等等,都可以进行。

License: LGPL v3 license (AFoege.Net 的 license,毕竟是从它修改的). 源码:https://github.com/xiaotie/GebVideoFFMPEG

演示:

wps_clip_image-5141

代码下载:Geb.Video.FFMPEG.Demo

读取视频文件,获取视频参数

_reader = new VideoFileReader();
_reader.Open(path);
String info = String.Format("Video info:\r\n\r\n Width-{0}\r\n Height-{1}\r\n FrameCount-{2}\r\n FrameRate-{3}\r\n Codec-{4}",_reader.Width,_reader.Height,_reader.FrameCount, _reader.FrameRate, _reader.CodecName);
tbInfo.Text = info;

读取下一帧:

ImageRgb24 img = _reader.ReadVideoFrame();

查找帧:

// 指定帧的编号
Int64 idx = _reader.FrameCount * 2 / 3;
// 跳到指定帧附近的关键帧处,true 为跳到关键帧,false 为跳到任意帧
_reader.Seek(idx, true);

写入视频文件

VideoFileWriter _writer = new VideoFileWriter();
_writer.Open("output.avi", _reader.Width, _reader.Height, _reader.FrameRate, VideoCodec.MPEG4);
// demo 代码,之处理 100 帧
for (int i = 0; i < 100; i++)
{
    ImageRgb24 img = _reader.ReadVideoFrame();
    if (img == null) break;
    _writer.WriteVideoFrame(img);
    img.Dispose();
}
_writer.Close();

不用时别忘记 Close()。

相关文章:

  • Handler运行机制
  • 交换机端口利用
  • Phalcon资源文件管理(Assets Management)
  • 高清壁纸:2013年1月日历桌面壁纸免费下载
  • C# .NET开发图形图像程序时提示GDI+ 中发生一般性错误
  • centosx64 6.3安装firefox 17.0.1无法使用 flash
  • Linux下MySql安装配置方法总结
  • VC6.0入门使用
  • odbc备忘
  • C#实现网页表单自动提交
  • 分享:mahout in action ----分类的原理
  • CI框架 -- 核心文件 之 Input.php(输入数据处理文件)
  • 人人网 揭秘社交网络指开放平台技术
  • Android - 文字向上翻滚效果的实现
  • 大叔也学Xamarin系列
  • 03Go 类型总结
  • Angular 4.x 动态创建组件
  • Angular2开发踩坑系列-生产环境编译
  • Git学习与使用心得(1)—— 初始化
  • Java 网络编程(2):UDP 的使用
  • Java编程基础24——递归练习
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS数组方法汇总
  • Meteor的表单提交:Form
  • springMvc学习笔记(2)
  • vue的全局变量和全局拦截请求器
  • 安装python包到指定虚拟环境
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 翻译--Thinking in React
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 应用生命周期终极 DevOps 工具包
  • 用jquery写贪吃蛇
  • 终端用户监控:真实用户监控还是模拟监控?
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • # Apache SeaTunnel 究竟是什么?
  • #includecmath
  • #pragma multi_compile #pragma shader_feature
  • (30)数组元素和与数字和的绝对差
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (译) 函数式 JS #1:简介
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET框架设计—常被忽视的C#设计技巧
  • //解决validator验证插件多个name相同只验证第一的问题
  • ::before和::after 常见的用法
  • [ linux ] linux 命令英文全称及解释
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [cocos creator]EditBox,editing-return事件,清空输入框