C#,实用代码,整理视频文件必备函数,提取avi,mpeg,mp4,rmvb,mkv,flv等等视频文件摘要信息的方法及其源程序

本文摘要介绍了avi,mpeg,mp4,rmvb,mkv,flv等视频文件,给出了用开源ffmpeg程序提取这些文件摘要信息(分辨率、时长)的C#源代码。

一、视频文件简介

1.1 AVI(*.avi文件)

AVI英文全称为Audio Video Interleaved,即音频视频交错格式,是微软公司于1992年11月推出、作为其Windows视频软件一部分的一种多媒体容器格式。
AVI文件将音频(语音)和视频(影像)数据包含在一个文件容器中,允许音视频同步回放。类似DVD视频格式,AVI文件支持多个音视频流。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。
它于1992年被Microsoft公司推出,随Windows 3.1一起被人们所认识和熟知。所谓“音频视频交错”,就是可以将视频和音频交织在一起进行同步播放。这种视频格式的优点是可以跨多个平台使用,其缺点是体积过于庞大,而且更加糟糕的是压缩标准不统一,最普遍的现象就是高版本Windows媒体播放器播放不了采用早期编码编辑的AVI格式视频,而低版本Windows媒体播放器又播放不了采用最新编码编辑的AVI格式视频,所以我们在进行一些AVI格式的视频播放时常会出现由于视频编码问题而造成的视频不能播放或即使能够播放,但存在不能调节播放进度和播放时只有声音没有图像等一些莫名其妙的问题,如果用户在进行AVI格式的视频播放时遇到了这些问题,可以通过下载相应的解码器来解决。AVI是视频文件的常见封装格式,比如一些游戏、教育软件的片头,多媒体光盘中,都会有不少的AVI。在Windows各版本操作系统里都能直接播放AVI,而且它自己的格式也有好几种,最常见的有Intel Indeo(R)Video R3.2.Microsoft video 等。
AVI含三部分:文件头、数据块和索引块。
其中数据块包含实际数据流,即图像和声音序列数据。这是文件的主体,也是决定文件容量的主要部分。视频文件的大小等于该文件的数据率乘以该视频播放的时间长度,索引块包括数据块列表和它们在文件中的位置,以提供文件内数据随机存取能力。文件头包括文件的通用信息,定义数据格式,所用的压缩算法等参数。
nAVI格式
nAVI是newAVI的缩写,是一个名为ShadowRealm的地下组织发展起来的一种新视频格式(与我们上面所说的AVI格式没有太大联系)。它是由Microsoft ASF压缩算法的修改而来的,但是又与下面介绍的网络影像视频中的ASF视频格式有所区别,它以牺牲原有ASF视频文件视频“流”特性为代价而通过增加帧率来大幅提高ASF视频文件的清晰度。
DV的英文全称是Digital Video Format,是由索尼、松下、JVC等多家厂商联合提出的一种家用数字视频格式。数码摄像机就是使用这种格式记录视频数据的。它可以通过电脑的IEEE 1394接口传输视频数据到电脑,也可以将电脑中编辑好的的视频数据回录到数码摄像机中。这种视频格式的文件扩展名一般是.avi,所以也叫DV-AVI格式。
2007年10月,AVI图像反转的原因很可能是暴风影音和Windows Media Player冲突,下载一个完整的DVIX解码器可以解决。
1992年初Microsoft公司推出了AVI技术及其应用软件VFW(Video for Windows)。在AVI文件中,运动图像和伴音数据是以交织的方式存储,并独立于硬件设备。这种按交替方式组织音频和视像数据的方式可使得读取视频数据流时能更有效地从存储媒介得到连续的信息。构成一个AVI文件的主要参数包括视像参数、伴音参数和压缩参数等:
AVI没有MPEG这么复杂,从Windows 3.1时代,它就已经面世了。它最直接的优点就是兼容好、调用方便而且图象质量好,因此也常常与DVD相并称。但它的缺点也是十分明显的:体积大。也是因为这一点,我们才看到了MPEG-1和MPEG-4的诞生。2小时影像的AVI文件的体积与MPEG-2相差无几,不过这只是针对标准分辨率而言的:根据不同的应用要求,AVI的分辨率可以随意调。窗口越大,文件的数据量也就越大。降低分辨率可以大幅减低它的体积,但图象质量就必然受损。与MPEG-2格式文件体积差不多的情况下,AVI格式的视频质量相对而言要差不少,但制作起来对电脑的配置要求不高,经常有人先录制好了AVI格式的视频,再转换为其他格式。

1.2 MPEG与 MPEG4(*.mp4文件)

MPEG(Moving Picture Experts Group,动态图像专家组)是ISO(International Standardization Organization,国际标准化组织)与IEC(International Electrotechnical Commission,国际电工委员会)于1988年成立的专门针对运动图像和语音压缩制定国际标准的组织。

MPEG标准主要有以下五个,MPEG-1、MPEG-2、MPEG-4、MPEG-7及MPEG-21等。该专家组建于1988年,专门负责为CD建立视频和音频标准,而成员都是为视频、音频及系统领域的技术专家。及后,他们成功将声音和影像的记录脱离了传统的模拟方式,建立了ISO/IEC11172压缩编码标准,并制定出MPEG-格式,令视听传播方面进入了数码化时代。因此,大家现时泛指的MPEG-X版本,就是由ISO (InternationalOrganization for Standardization) 所制定而发布的视频、音频、数据的压缩标准。
MPEG标准的视频压缩编码技术主要利用了具有运动补偿的帧间压缩编码技术以减小时间冗余度,利用DCT技术以减小图像的空间冗余度,利用熵编码则在信息表示方面减小了统计冗余度。这几种技术的综合运用,大大增强了压缩性能。

1.2.1 MPEG-4

MPEG-4在1995年7月开始研究,1998年11月被ISO/IEC批准为正式标准,正式标准编号是ISO/IEC14496,它不仅针对一定比特率下的视频、音频编码,更加注重多媒体系统的交互性和灵活性。这个标准主要应用于视像电话、视像电子邮件等,对传输速率要求较低,在4800-6400bits/s之间,分辨率为176*144。MPEG-4利用很窄的带宽,通过帧重建技术、数据压缩,以求用最少的数据获得最佳的图像质量。利用MPEG-4的高压缩率和高的图像还原质量可以把DVD里面的MPEG-2视频文件转换为体积更小的视频文件。经过这样处理,图像的视频质量下降不大但体积却可缩小几倍,可以很方便地用CD-ROM来保存DVD上面的节目。另外,MPEG-4在家庭摄影录像、网络实时影像播放也大有用武之地。
MPEG专家组的专家们正在为MPEG-4的制定努力工作。MPEG-4标准主要应用于视像电话(videophone),视像电子邮件(VideoEmail)和电子新闻(Electronicnews)等,其传输速率要求较低,在4800-64000bits/sec之间,分辨率176X144。MPEG-4利用很窄的带宽,通过帧重建技术,压缩和传输数据,以求以最少的数据获得最佳的图象质量。
与MPEG-1和MPEG-2相比,MPEG-4的特点是其更适于交互AV服务以及远程监控。MPEG-4是第一个使你由被动变为主动(不再只是观看,允许你加入其中,即有交互性)的动态图象标准;它的另一个特点是其综合性;从根源上说,MPEG-4试图将自然物体与人造物体相溶合(视觉效果意义上的)。MPEG-4的设计目标还有更广的适应性和可扩展性。

1.2.2 MPEG-7


MPEG-7(它的由来是1+2+4=7,因为没有MPEG-3、MPEG-5、MPEG-6)于1996年10月开始研究。确切来讲,MPEG-7并不是一种压缩编码方法,其正规的名字叫做’多媒体内容描述接口,其目的是生成一种用来描述多媒体内容的标准,这个标准将对信息含义的解释提供一定的自由度,可以被传送给设备和电脑程序,或者被设备或电脑程序查取。MPEG-7并不针对某个具体的应用,而是针对被MPEG-7标准化了的图象元素,这些元素将支持尽可能多的各种应用。建立MPEG-7标准的出发点是依靠众多的参数对图象与声音实现分类,并对它们的数据库实现查询,就象我们查询文本数据库那样。可应用于数字图书馆,例如图象编目、音乐词典等;多媒体查询服务,如电话号码簿等;广播媒体选择,如广播与电视频道选取;多媒体编辑,如个性化的电子新闻服务、媒体创作等。
 

1.2.3 MPEG-21


MPEG在1999年10月的MPEG会议上提出了“多媒体框架”的概念,同年的12月的MPEG会议确定了MPEG-21的正式名称是“多媒体框架”或“数字视听框架”,它以将标准集成起来支持协调的技术以管理多媒体商务为目标,目的就是理解如何将不同的技术和标准结合在一起需要什么新的标准以及完成不同标准的结合工作。

1.3 RM与RMVB(*.rmbv文件)

RealMedia可变比特率(RMVB)是RealNetworks公司开发的RealMedia多媒体数字容器格式的可变比特率(VBR)扩展版本。相对于更常见的按固定比特率(CBR)编码的流媒体RealMedia容器,RMVB典型应用于保存在本地的多媒体内容。使用该格式文件的扩展名是".rmvb"。
RMVB是一种视频文件格式,其中的VB指Variable Bit Rate(可变比特率)。较上一代RM格式画面要清晰很多,原因是降低了静态画面下的比特率。

1.3.1 RM与RMVB

普通的RM格式是Real 8.0格式,采用固定码率编码。多见于VCD-RM,曾流行了一段时间。
RMVB比RM多了一个VB,VB指的是Variable Bitrate,动态码率或可变比特率,是RealNetworks公司的编码格式的9.0版本。RealMedia使用的压缩方法类似MPEG-4 Part 10编码,比如x264。RMVB格式的文件头包含四个字节的".RMF",对应十六进制是2E 52 4D 46,这个文件头和标准的RealMedia格式相同。 
RMVB(Real 9.0)在音频编码上仍采用RM(Real 8.0)格式,压片时至少采用64Kbps stereo music,通常是96K,MTV类的有用到128K,再高就没必要压缩了。
RMVB与格式转换
RMVB实际上是Real Helix系列的一种媒体容器,与本身编码格式没有关系,类似于AVI、MKV等格式。本身编码器增加了VBR动态比特率技术的9.0版本,并且采用了部分H263/H264的算法特性使得画质和流程性大大提升。关于VCD和DVD、DVDRIP转码,有很多人会产生误区认为低画质RMVB毫无意义,其实是不对的。
首先VCD 采用的是MPEG-1 PS流,虽然有马赛克问题,但是如果是正版碟或DV转换来的效果并不会特别差,如果采用Real老一代的RM世代的编码器马赛克效果的比较明显而且因为码率低的情况下会影响流畅性;反之Real Helix 9.0之后的编码技术增加了很强的解码和消除马赛克的能力所以同码率效果会大大提升,并且还有一种终极提升画质的选项2-pass。利用一次查询二遍编码的技术利用了VBR的特性大大提升了节目的还原度,同时保证流畅性。
而DVD采用了MPEG-2技术(不少DVD压制也采用了VBR技术和2-pass),一方面会有场序(图像拉丝的效果,需要做反场处理)并且颜色区域也有YUV、YV2,另外解析度也是VCD(720x480或720x576)的一倍所以在低码率下RMVB的2-pass编码质量会好很多。
DVDRIP一般采用Xvid/DivX作为编码,本身已经通过一些工具消除了场序和颜色问题所以画面已经优化了不少,并且大部分都是VBR的编码转换的,所以转为RMVB后的效果会远远好于老旧的RM格式。
RMVB不是开源的技术而且它的版权问题也引起了严重的争议,对于共享主义者,推荐XVID和H.264这两种编码算法。

1.3.2 RMVB的历史

RMVB的前身为RM格式,它们是Real Networks公司制定的音频视频压缩规范,根据不同的网络传输速率,而制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放,具有体积小,画质不错的优点。
早期的RM格式为了能够实现在有限带宽的情况下,进行视频在线播放而被研发出来,并一度红遍整个互联网。而为了实现更优化的体积与画面质量,Real Networks公司不久又在RM的基础上,推出了可变比特率编码的RMVB格式。RMVB的诞生,打破了原先RM格式那种平均压缩采样的方式,在保证平均压缩比的基础上,采用浮动比特率编码的方式,将较高的比特率用于复杂的动态画面(如歌舞、飞车、战争等),而在静态画面中则灵活地转为较低的采样率,从而合理地利用了比特率资源,使RMVB最大限度地压缩了影片的大小,最终拥有了近乎完美的接近于DVD品质的视听效果。我们可以做个简单对比,一般而言一部120分钟的DVD体积为4GB,而RMVB格式来压缩,仅400MB左右,而且清晰度流畅度并不比原DVD差太远。
人们为了缩短视频文件在网络进行传播的下载时间,为了节约用户电脑硬盘宝贵的空间容量,已越来越多的视频被压制成了RMVB格式,并广为流传。在RMVB格式使用兴盛时期可能每一位电脑使用者电脑中的视频文件,超过80%都会是RMVB格式。但到如今,RMVB格式已被mp4、MKV等格式所替代。

1.3.3 DVDRIP VS rmvb

有关DVDRIP和rmvb的比较日渐增多。严格来说,二者各具优缺点,在很大程度上不具可比性。我这里只是想提一句:在画质上400M数据量(rmvb)的能和1.4G的数据量(2CDDVDRIP)比吗?但是400M的数据量损失的只不过是细节和不必要的高音频码率,整体画质和音频基本满意。400M/1.4G对于下载和存盘又是个什么概念?AC3效果和44k立体声对一般人来说是体会不出差别的,另外强调音频效果的基本可以说是不懂多媒体压缩概念的(我这里就得罪某些人了)。
DVDRIP给我们带来了高清晰的电影画质享受,也给rmvb压缩者提供了优质的片源。DVDRIP因为可以灵活选择字幕,因此在提供新片方面有优势。而rmvb因为整合进了字幕,不能盲目压片,直接用没有校正的字幕压出的rmvb即使设置合理、用2pass压也是失败之作。因此rmvb在保存经典片、字幕几经调整的大片方面又价值。虽然rmvb也可外挂字幕,但效果不是很好!不过却是一种很好的思路,我们应该动观其变。一直以来,DVDRIP制作小组、字幕小组、rmvb制作小组可存在相互依存的关系,但现在DVD的vob文件-rmvb一部到位也能实现,而且据我的经验效果很好。如此rmvb与DVDRIP更有一博了。现在好多论坛在提供DVDRIP时也推出了rmvb版本,如牛过、新世界、天堂论坛等。更多的论坛基本是单独提供DVDRIP或rmvb,如海浩、永飞、急速、新动感等(实际是分流,会员交流上传、下载,自己没有相应的制作小组)。
现在DVDRIP的制作也能控制大小了,如采用xdiv格式编码,音频用mp3编码等等,120min的电影最终文件都能控制在1CD,这样的DVDRIP与rmvb才有可比性。当然压成rmvb,120min的大小能控制在350M左右,就根据自己的网络条件和硬盘大小来选定了。我对于1CD的DVDRIP还是很喜欢的,毕竟在细节上的清晰度优于rmvb。
 

1.4 MKV(*.mkv文件)

Matroska多媒体容器(Multimedia Container)是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是Matroska定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。在概念上Matroska和其他容器,比如AVI、MP4或ASF(Advanced Streaming Format,即高级流格式)比较类似,但其在技术规程上完全开放,在实现上包含很多开源软件。可将多种不同编码的视频及16条以上不同格式的音频和不同语言的字幕流封装到一个Matroska 媒体文件当中。最大的特点就是能容纳多种不同类型编码的视频、音频及字幕流。
mkv不同于DivX、XviD等视频编码格式,也不同于MP3、Ogg等音频编码格式。MKV是为这些音、视频提供外壳的“组合”和“封装”格式。换句话说就是一种容器格式,常见的 DAT(是VCD的一种编码格式)AVl、VOB、MPEG、RM 格式其实也都属于这种类型。但它们要么结构陈旧,要么不够开放,这才促成了MKV这类新型多媒体封装格式的诞生。
Matroska的文件扩展名,对于携带了音频、字幕的视频文件是.MKV;对于3D立体影像视频是.MK3D;对于单一的纯音频文件是.MKA;对于单一的纯字幕文件是.MKS。
avi的出现已经超过了10年,渐渐体现出老态了,除了近年通过VD可以拥有2个音轨,没有其他的改进。
ogm的出现,标志着多音轨格式的出现,可以合成8个以上的音轨,音频上自然也多了ogg这个格式,重要的是可以“内挂”字幕,老外称为“软字幕”,可以任意开关,可以“内挂”8个以上的字幕,美中不足的是仅仅支持srt格式,并且不支持Unicode,对亚洲字符支持严重不足。
还有一个就是Chapter功能,可以自定义段落,播放时就可以选择了。是不是越来越像DVD啦?但是当时的ogm源码是不公开的,就那么几个人在开发,自然进度慢了,前一阵几乎陷入了“死亡”。最近宣布公开源码,加入Open Source行列,重新开始开发。
mkv就是在ogm停滞的那段时间出现的,由俄罗斯的程序员开发的,从一开始就是Open Source,因此得到了很多其他程序员的帮助,开发速度相当快。
ogm有的mkv都有,另外还有很多独特的功能。其中最令人振奋的就是Gabest(开发vobsub的公司)开发的Plugin,不仅开发了专门的播放器Media Player Classic(俗称MPC), 这个东西的强大相信用过的人都有体会。还开发了很多的MKV用的Mux(合成器),尤其是Real格式的Mux。 Real的rmvb是封闭格式,官方的Helix根本就不支持多声道所以尽管算法很优秀,但在声效大片的再现上就无能为力了,只能乖乖让位给可以合成AC3和DTS的avi以及ogm了。
但Gabest开发的Realmedia Splitter和mkv Mux可以让rmvb格式的视频和AC3、DTS合成mkv,从根本上克服了rmvb音频上的弱点。不仅如此,还开发了VSFilter.dll和SubtitleSource.ax这2个Plugin,宣布支持ssa和ass的格式软字幕。
总结就是下面几条:
1.支持多种格式的视频和音频,尤其是Real ;
2.支持多音轨,多达16条以上 ;
3.支持ssa,ass软字幕,多达16条以上 ;
4.支持段落选取(由制作人决定) 。

1.5 FLV(*.flv文件)

FLV 是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。

FLV作为一种新兴的网络视频格式,能得到众多的网站支持并非偶然。除了FLV视频格式本身占有率低、视频质量良好、体积小等特点适合网络发展外,丰富、多样的资源也是FLV视频格式统一在线播放视频格式的一个重要因素。从最新的变形金刚到越狱再到各项体育节目,甚至于网友制作的自拍视频等都可以在网络中轻而易举的找到。
在互联网上提供FLV视频的有两类网站,一种是专门的视频分享网站如美国的YouTube网站、国内的六间房、土豆网等。另一种是门户网站提供了视频播客的板块,提供了自己的视频频道,如新浪视频播客等,也是使用FLV格式的视频。此外,百度也推出了关于视频搜索的功能,里面搜索出来的视频基本都是采用了流行的FLV格式。

二、FFMPEG开源组件

2.1 FFmpeg简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。FFmpeg编码库可以使用GPU加速。

2.2 FFmpeg下载

官网:

FFmpeg官网

2.3 提取视频文件的摘要信息

本文提供C#源程序用于提取多种格式视频文件的摘要信息。

2.3.1 思路

调用执行 ffmpeg 包的 ffprobe.exe ,生成 json 格式的数据,并用 Newtonsoft.json 反序列化得到相关信息即可。

C:\\Downloads\\Softwares\\ffmpeg\\bin\\ffprobe.exe -v quiet -show_format -show_streams -print_format json 视频文件名

注意:

(1)ffprobe.exe 的目录请修改到你的安装文件夹;

(2)视频文件名最好用双引号括起来:"c:/a/a.mkv"

2.3.2 C#调用 ffprobe.exe 的源程序

下面代码中的 vf 就是 video file.

using System.Diagnostics;

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "C:\\Downloads\\Softwares\\ffmpeg\\bin\\ffprobe.exe",
        Arguments = "-v quiet -show_format -show_streams -print_format json \"" + vf + "\"",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};

proc.StartInfo.StandardOutputEncoding = Encoding.UTF8;
proc.Start();

StringBuilder sb = new StringBuilder();
while (!proc.StandardOutput.EndOfStream)
{
    string line = proc.StandardOutput.ReadLine();
    sb.AppendLine(line);
}

string json = sb.ToString();

2.3.3 json文件实例

上面的代码会得到一个视频信息描述的 json 数据。

{
    "streams": [
        {
            "index": 0,
            "codec_name": "h264",
            "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
            "profile": "High",
            "codec_type": "video",
            "codec_tag_string": "avc1",
            "codec_tag": "0x31637661",
            "width": 1920,
            "height": 1080,
            "coded_width": 1920,
            "coded_height": 1080,
            "closed_captions": 0,
            "film_grain": 0,
            "has_b_frames": 2,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "16:9",
            "pix_fmt": "yuv420p",
            "level": 50,
            "chroma_location": "left",
            "field_order": "progressive",
            "refs": 1,
            "is_avc": "true",
            "nal_length_size": "4",
            "id": "0x1",
            "r_frame_rate": "25/1",
            "avg_frame_rate": "25/1",
            "time_base": "1/12800",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 66805248,
            "duration": "5219.160000",
            "bit_rate": "3005557",
            "bits_per_raw_sample": "8",
            "nb_frames": "130479",
            "extradata_size": 43,
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0,
                "timed_thumbnails": 0,
                "captions": 0,
                "descriptions": 0,
                "metadata": 0,
                "dependent": 0,
                "still_image": 0
            },
            "tags": {
                "language": "und",
                "handler_name": "VideoHandler",
                "vendor_id": "[0][0][0][0]"
            }
        },
        {
            "index": 1,
            "codec_name": "aac",
            "codec_long_name": "AAC (Advanced Audio Coding)",
            "profile": "LC",
            "codec_type": "audio",
            "codec_tag_string": "mp4a",
            "codec_tag": "0x6134706d",
            "sample_fmt": "fltp",
            "sample_rate": "48000",
            "channels": 2,
            "channel_layout": "stereo",
            "bits_per_sample": 0,
            "initial_padding": 0,
            "id": "0x2",
            "r_frame_rate": "0/0",
            "avg_frame_rate": "0/0",
            "time_base": "1/48000",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 250517472,
            "duration": "5219.114000",
            "bit_rate": "259574",
            "nb_frames": "244647",
            "extradata_size": 5,
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0,
                "timed_thumbnails": 0,
                "captions": 0,
                "descriptions": 0,
                "metadata": 0,
                "dependent": 0,
                "still_image": 0
            },
            "tags": {
                "language": "und",
                "handler_name": "SoundHandler",
                "vendor_id": "[0][0][0][0]"
            }
        }
    ],
    "format": {
        "filename": "D:\\迅雷下载\\绝杀.Jue.sha.1993.HD1080P.国语无字.mp4",
        "nb_streams": 2,
        "nb_programs": 0,
        "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
        "format_long_name": "QuickTime / MOV",
        "start_time": "0.000000",
        "duration": "5219.160000",
        "size": "2134124579",
        "bit_rate": "3271215",
        "probe_score": 100,
        "tags": {
            "major_brand": "isom",
            "minor_version": "512",
            "compatible_brands": "isomiso2avc1mp41",
            "encoder": "Lavf56.18.101"
        }
    }
}

各参数的意义,请百度。

2.3.4 必要的基础类(class)

MovieInfo.cs

public class MovieInfo
{
    public MovieStream[] streams { get; set; }
    public MovieFormat format { get; set; } = new MovieFormat();
}

MovieStream.cs

public class MovieStream
{
    public int index { get; set; } = 0;
    public string codec_name { get; set; } = "h264";
    public string codec_long_name { get; set; } = "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10";
    public string profile { get; set; } = "High";
    public string codec_type { get; set; } = "video";
    public string codec_tag_string { get; set; } = "avc1";
    public string codec_tag { get; set; } = "0x31637661";
    public int width { get; set; } = 1920;
    public int height { get; set; } = 1080;
    public int coded_width { get; set; } = 1920;
    public int coded_height { get; set; } = 1080;
    public int closed_captions { get; set; } = 0;
    public int film_grain { get; set; } = 0;
    public int has_b_frames { get; set; } = 2;
    public string sample_aspect_ratio { get; set; } = "1:1";
    public string display_aspect_ratio { get; set; } = "16:9";
    public string pix_fmt { get; set; } = "yuv420p";
    public int level { get; set; } = 50;
    public string chroma_location { get; set; } = "left";
    public string field_order { get; set; } = "progressive";
    public int refs { get; set; } = 1;
    public bool is_avc { get; set; } = true;
    public int nal_length_size { get; set; } = 4;
    public string id { get; set; } = "0x1";
    public string r_frame_rate { get; set; } = "25/1";
    public string avg_frame_rate { get; set; } = "25/1";
    public string time_base { get; set; } = "1/12800";
    public int start_pts { get; set; } = 0;
    public string start_time { get; set; } = "0.000000";
    public long duration_ts { get; set; } = 66805248;
    public string duration { get; set; } = "5219.160000";
    public string bit_rate { get; set; } = "3005557";
    public string bits_per_raw_sample { get; set; } = "8";
    public string nb_frames { get; set; } = "130479";
    public int extradata_size { get; set; } = 43;
    public MovieDisposition disposition { get; set; }
    public MovieTag tags { get; set; }

    public MovieStream() { }
}

MovieDisposition.cs

public class MovieDisposition
{
    [JsonProperty("default")]
    public int _default { get; set; } = 1;
    public int dub { get; set; } = 0;
    public int original { get; set; } = 0;
    public int comment { get; set; } = 0;
    public int lyrics { get; set; } = 0;
    public int karaoke { get; set; } = 0;
    public int forced { get; set; } = 0;
    public int hearing_impaired { get; set; } = 0;
    public int visual_impaired { get; set; } = 0;
    public int clean_effects { get; set; } = 0;
    public int attached_pic { get; set; } = 0;
    public int timed_thumbnails { get; set; } = 0;
    public int captions { get; set; } = 0;
    public int descriptions { get; set; } = 0;
    public int metadata { get; set; } = 0;
    public int dependent { get; set; } = 0;
    public int still_image { get; set; } = 0;
    public MovieDisposition() { }
}

MovieTag.cs

public class MovieTag
{
    public string language { get; set; } = "und";
    public string handler_name { get; set; } = "VideoHandler";
    public string vendor_id { get; set; } = "[0][0][0][0]";
    public MovieTag() { }
}

MovieFormat.cs

public class MovieFormat
{
    public string filename { get; set; } = "D:\\迅雷下载\\绝杀.Jue.sha.1993.HD1080P.国语无字.mp4";
    public int nb_streams { get; set; } = 2;
    public int nb_programs { get; set; } = 0;
    public string format_name { get; set; } = "mov,mp4,m4a,3gp,3g2,mj2";
    public string format_long_name { get; set; } = "QuickTime / MOV";
    public string start_time { get; set; } = "0.000000";
    public string duration { get; set; } = "5219.160000";
    public string size { get; set; } = "2134124579";
    public string bit_rate { get; set; } = "3271215";
    public int probe_score { get; set; } = 100;
    public MovieFormatTag tags { get; set; }
    public MovieFormat() { }
}

MovieFormatTag.cs

public class MovieFormatTag
{
    public string major_brand { get; set; } = "isom";
    public string minor_version { get; set; } = "512";
    public string compatible_brands { get; set; } = "isomiso2avc1mp41";
    public string encoder { get; set; } = "Lavf56.18.101";
    public MovieFormatTag() { }
}

2.3.5 json 反序列化为 class 类信息并使用之(参考代码)

string json = sb.ToString();
try
{
    MovieInfo mi = JsonConvert.DeserializeObject<MovieInfo>(json);

    foreach (MovieStream ms in mi.streams)
    {
        if (ms.codec_type != "video") continue;
        FileInfo fx = new FileInfo(vf);
        sb.Append(ChineseName(fx.Name) + "_");
        sb.Append(ms.coded_width + "x" + ms.coded_height + "_");
        sb.Append((ms.duration));
        sb.Append(fx.Extension.ToLower());
        string nf = sb.ToString();
        return nf;
    }
    return vf;
}
catch (Exception ex)
{
    return vf;
}

优秀软件请参阅 视频文件预览与管理系统

在此基础上可以编写各种视频小工具软件。

猜你喜欢

转载自blog.csdn.net/beijinghorn/article/details/127169136