代码改变世界

.Net 玩视频

2012-02-22 15:16  熬夜的虫子  阅读(4459)  评论(6编辑  收藏  举报

由于平台的特点 用.net做视频网站的不多 作为兴趣研究下


背景

经常上土豆 youku的朋友可能会发现播放的视频格式大多是flv格式的 那么我们先来扫盲下flv

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

更多参考百科 http://baike.baidu.com/view/364757.htm

但是用户手上的资源未必都是flv格式,所以需要格式转换。这里介绍2款工具

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

更多参考百科 http://baike.baidu.com/view/856526.htm

mencoder 是一款命令行方式的视频处理软件,mencoder支持几乎所有的格式的视频转换,可以将任意格式转换到任意格式,转换功能可以说是相当强大。目前市面上流行的格式转换器,都是基于mencoder开发的GUI,比如暴风转码,格式工厂等。可以说转换器能办到的,mencoder都能办到,但mencoder能办到的,转换器就不一定能办到了。

更多参考百科 http://baike.baidu.com/view/3353694.htm

不过FFmpeg和在mencoder在应用领域还是有些区别

网摘:

1,在实际的使用当中,ffmpeg 在 Redhat与Suse Linux 下面都运行正常,但是我在Suse Linux 10 上面压缩rm与 rmvb 视频时,压出来的片子声音不正常。在其他参数都完全一样的情况下使用Redhat 压缩,居然是正常的。看来 Suse 对企业应用比较好,但是对多媒体的应用(偏向个人方面)还是 Redhat 比较好一些。
2,ffmpeg 也可以压缩视频,不过,效果可是比mencoder 差好些。所以,基本上我只使用 ffmpeg 来抓取视频中的图片。可以使用 ffmpeg-php 这个开源项目程序来抓取任何一帧的图片,这样,我们就可以很方便地大致了解这个视频的内容了。
3,ffmpeg 压缩一个 wmv 文件,可能使用不到一分钟,但是 mencoder 却压缩了好几分钟,由于 mencoder 需要计算更多东西,所以,需要花更多的时间。
4,mencoder 支持的视频格式非常多,如常见的 wmv,avi,mpg,rm,rmvb,mov,3gp,mp4 等,大约有上百种,不过,我还无法一一测试,估计也是没有问题的。而ffmpeg 不支持 rm与rmvb 格式。
5,做为视频压缩,对机器的要求是比较高的,对系统资源的占用比较大,主要是对CPU与磁盘IO要求高。前两天压缩一个视频,使用 宝德 PR2700D 用了4分钟,使用宝德 PR4800 用了12分钟,使用一台 Dell 2950 上面的 Vmware 虚拟机使用了大约8分钟。综合来看,最好是CPU强一些,内存不要小于2GB,磁盘的IO要快一些。


实践

上述2款工具都有对应的win平台版本 那么我们只需要用.net启动软件进程就可以了 很简单 需要花功夫的是对工具各种复杂参数的把握

先上个简单的demo

我们选举一个很简单的视频 windows自带的示例视频 可以在目录C:\WINDOWS\clock.avi找到


每秒换一个数字

ffmpeg 压缩一个 视频 文件,可能使用不到一分钟,但是 mencoder 却压缩了好几分钟,由于 mencoder 需要计算更多东西,所以,需要花更多的时间。ffmpeg 也可以压缩视频,不过,效果可是比mencoder 差好些。并且ffmpeg对","wmv", "rmvb", "rm" 的效果不是很好,所以考虑的性能以及功能,"asf", "avi", "mpg", "3gp", "mov" 类型和截图功能使用ffmepg,"wmv", "rmvb", "rm"类型使用mencoder实现

所以我们这里用ffmpeg来转换

到输出目录中确认下我们转换的视频是否可用

我们再试试截图功能

我们截取2秒后和4秒后的 按照视频进度 应该截取到3和5 这2个数字

OK 貌似很顺利

下面给出具体的参数配置

ffmpeng

使用: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...
-L                  查看许可证
-h                  显示说明
-version            显示版本
-formats            显示可用的格式,编解码器,协议... 
-f fmt              输出格式
-i filename         输入文件名称
-y                  覆盖输出文件
-t duration         设定录音时间
-fs limit_size      设置限制文件大小
-ss time_off        设置开始时间偏移
-itsoffset time_off 设置输入时间偏移
-title string       设置标题
-timestamp time     设定时间戳记
-author string      设置作者
-copyright string   设置版权
-comment string     设置评论
-album string       设置相册
-v verbose          控制总额日志
-target type        指定的目标文件类型 ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)
-dframes number     设置数据帧的记录
-scodec codec       强制字幕编码器 ('copy' to copy stream)
-newsubtitle        添加一个新的字幕流,以目前的输出流
-slang code         设置ISO 639语言代码(3 字母)目前字幕高级视频设置:
-vframes number     设置视频帧记录
-r rate             设置帧比率(Hz value, fraction or abbreviation)
-s size             设置帧大小 (WxH or abbreviation)
-aspect aspect      设置的长宽比 (4:3, 16:9 or 1.3333, 1.7777)
-croptop size       设置顶端作频率的大小 (in pixels)
-cropbottom size    设置底端作频率的大小  (in pixels)
-cropleft size      设置左端作频率的大小 (in pixels)
-cropright size     设置右端作频率的大小(in pixels)
-padtop size        设置顶端频率的大小 (in pixels)
-padbottom size     设置底部频率的大小(以像素)
-padleft size       设置左频率的大小(以像素)
-padright size      设置右频率的大小(以像素)
-padcolor color     设置颜色的频率(十六进制000000通过ffffff )
-vn                 禁用视频
-vcodec codec       强制视频编码器 ('copy' to copy stream)
-sameq              使用相同视频质量作为源(implies VBR)
-pass n             选择通过数量(1 or 2)
-passlogfile file   选择两个通过日志文件名称
-newvideo           添加一个新的视频流,以目前的输出高级视频流选项:
-pix_fmt format     设置像素格式
-intra              使用内部帧
-vdt n              放弃起增点
-qscale q           使用固定的视频量化规模(VBR)
-qdiff q            最大值之间的差异量化表(VBR)
-rc_eq equation     设置速率控制方程
-rc_override override 速率控制特定间隔覆盖
-me method          设置运动估计方法
-me_threshold       运动估计起增点
-strict strictness  如何严格按照标准
-deinterlace        反交错图片
-psnr               计算的PSNR压缩帧
-vstats             转储视频编码统计文件
-vhook module       插入视频处理模块
-intra_matrix matrix 指定内部矩阵系数
-inter_matrix matrix 指定跨矩阵系数
-top                top=1/bottom=0/auto=-1 场首要
-dc precision       内直流精度
-vtag fourcc/tag    强制视频四字符代码/标记
-qphist             显示 QP 柱形统计图
-vbsf bitstream filter 流过滤器的音频选项:
-aframes number     设置音频帧记录
-ab bitrate         设置音频比特率(在kb的速率/秒)
-aq quality         设定质量的音频质量(编解码器的具体)
-ar rate            设定音频采样率(赫兹)
-ac channels        指定数目的音频通道
-an                 禁用音频
-acodec codec       强制音频编码 ('copy' to copy stream)
-vol volume         改变声音大小 (256=normal)
-newaudio           增加一个新的音频流到当前输出流
-alang code         设置ISO 639语言代码(3 字母)目前字幕高级音频设置: 
-atag fourcc/tag    强制音频四字符代码/标记
-absf bitstream filter 过滤比特流子标题选项
-scodec codec       强制子标题编码('copy' to copy stream)
-newsubtitle        增加一个新的子标题流到当前输出流
-slang code         设置ISO 639语言代码(3 字母)目前字幕音频流/视频抓取设置:
-vd device          设置音频抓取设备
-vc channel         设置视频抓取频道(DV1394 only)
-tvstd standard     设置电视标准 (NTSC, PAL (SECAM))
-ad device          设置音频设备
-grab format        设置抓取用的格式
-gd device          设置高级抓取设备选项:
-map file:stream[:syncfile:syncstream] 设置输入数据流
-map_meta_data outfile:infile 设置中继数据信息从输入文件到输出文件
-benchmark          添加基准时间
-dump               转储每个输入数据包
-hex                当转储数据包时,也转储载重量
-re                 在本帧读入。比率
-loop_input         回路(目前只有工程与图片)
-loop_output        多少次循环的输出格式,支持循环( 0循环永远)
-threads count      线程计数
-vsync              视频同步方法
-async              音频同步方式
-vglobal            全球视频头存储类型
-copyts             复制时间戳
-shortest           最快完成输入编码
-dts_delta_threshold转换过程中数据包的大小, 即数据缓冲区的大小按照本意, 数据缓冲区越大转换速度越快, 但这与系统的运行状态有关
-ps size            设置数据包大小
-muxdelay seconds   设定最高解复用器-解码延迟
-muxpreload seconds 设置初始解复用器-解码延迟 
 
 

 Mencoder 参考http://www.ylmf.net/ubuntu/qa/2010122918996.html


 

附demo 随笔之作 不工整比较丑陋就不直接贴项目了 未加密 有兴趣的同学直接反编译看吧

demo下载 https://files.cnblogs.com/dubing/MaoyaVideo.rar

ffmpeng和mencoder的工具在网上搜一下 然后按照程序里的目录存放就可以了