|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在视频处理方向,一般使用硬件进行处理。当然使用MATLAB进行仿真处理,可以做到方面、节约时间、节省开支等。基于此,本程序在MATLAB实现正常的读取WMV格式的视频,并进行播放。目前还没有加视频处理算法。视频数据能够读取出来,还没有进行处理。
. P [) g2 ]0 j8 v( h. G. W- I B( h ]. w" s0 n8 s
MATLAB程序如下:
5 a" c6 v6 [; U# v0 K& d5 A9 q0 \. _! T: g$ i8 p) X3 q
%{5 g9 @: P6 e' e+ |& j0 \+ x2 ]
主题:使用matlab2010播放WMV视频& l5 ^, n) @0 ?
使用范围:$ U$ u% m9 B8 s5 q+ ]
可以用于视频处理。在硬件实现视频处理之前,首先使用MATLAB对3 O/ ^2 u& v1 B2 F, d% Q
算法进行仿真。这样可以及时的发现问题,避免不必要的开支。
" K0 i" @$ h$ z8 ~$ \! D1 ?: s; T制作:天空之恋* T4 r9 z3 X5 g, W: U5 v
地点:桂电/ ~% D/ X1 I1 }' ~
时间:
7 q3 C7 m/ s+ U说明:参考VideoReader标准使用方法
) c1 U3 B: T0 q6 ]. Q# ~%}
) g& Q2 D( i* @# j/ y%清除所有变量
+ {/ l6 [* K! g$ S0 A%读取视频文件
, ?& ]* N+ D6 M, c( Pvideo=VideoReader('test6.wmv');%此处使用mmreader()函数读取视频也可以。
1 F2 Y! x9 n6 |/ X6 ~4 L" [3 u. j0 A% 读取视频中所有数据
2 o/ Z j( | x( z: s6 ovidFrames = read(video);
' b) [0 E5 }4 }%读取视频的帧的个数
) i! a. Q- u" a, W& Z3 cnumFrames = get(video, 'numberOfFrames');%获得总的视频帧的个数: L c+ }3 d1 J
%从视频帧数据中创建一个MATLAB视频播放结构体% T0 U* H) l' o/ k
for k = 1 : numFrames
0 L% H" f" O3 o mov(k).cdata = vidFrames(:,:,:,k);
. }: o9 W" \3 Z %{
$ M- C2 @7 ]& I8 {0 P6 J r %---------亮点,处理程序都可以放在这里了。。5 `! r3 x, V5 ?' ]3 U
%这段程序是将视频转换成灰度图像,也就是彩色电视变成黑白电视
' e8 W; V1 U/ W* e a=vidFrames(:,:,1,k);
! ^2 e ]% p' [# O$ ]# q b=vidFrames(:,:,2,k);
- @) a$ Y2 `4 Z% M0 F' r& l c=vidFrames(:,:,3,k);6 g5 I3 k+ L* h% H
d=0.299*a+0.587*b+0.114*c;
6 a' M, e" M% e2 r9 P; h0 e mov(k).cdata=cat(3,d,d,d);
w& o" p m) a* J" z% w mov(k).colormap = [];
$ [& ^7 o" Z% U) {4 g %} / y" V) D! _# M
end / a' y- o; B3 u+ h, x
hf=figure;%创建图像
# a! b8 W* p! d3 ?1 A+ X %基于视频的宽度和高度重建图片& R8 w4 |$ i1 [
set(hf, 'position', [150 150 video.Width video.Height])9 b* ~: D- f0 H6 S g6 q
%按照视频帧速率重播视频
' @) h1 u5 W! C+ ]& y8 x movie(hf, mov, 1, video.FrameRate/3);%这个地方为什么要除3请看下面解释。
& }* _# T+ L, w& X" f% h/ \ F: x- w" A
问题:7 u( [6 N3 N$ [6 ]# C' o$ {* | |
1 F# @8 o/ F [+ c2 ?(1)读取WMV格式的视频MATLAB总是要有一个警告:
( g( v2 e% u1 C! j3 b- G! J
, E5 z" C0 L/ L+ x. `# bWarning: Unable to determine the number of frames in this file. # c: _5 L% K( V( b8 u& ]- t6 `
3 ]" d T) u1 G8 T9 o其实,这个警告是说不能确定视频帧的个数(能不确定帧的个数,也就不知道视频时间是多长,这个可能是个BUG吧,不懂。读取AVI视频的时候没有这个警告)。这个警告可以忽略,因为最终我们还是可以正常播放视频。
- _. W' S) m7 P( ]) a' ^0 q. j Q5 w
9 @' y% g; ?( i* d M(2)视频大小问题4 `% y6 n8 p5 T, ^
3 i, w2 d' [3 }9 e2 c8 ?
最开始我播放一个4分钟左右标准的WMV个数的视频(像素1024*768)。使用笔记本电脑读的视频的时候,电脑发热直接死机了。使用老式的台式机读取的时候,读了一分钟左右才能正常的播放视频。对于用MATLAB播放更长视频的,感觉就是找死了。
6 E! t9 r. _" e8 w) E7 b3 Z* ], c! Q" |* G2 v/ B" f, n
分析:MATLAB应该是首先读取视频总的帧的个数,可能是为了确定视频的总时长吧。视频一幅画面像素数越多、时间越长,MATLAB播放视频准备时间就越长(要等1分钟左右)。
# o* E& ?# p# l- N8 w, N" S' w6 K6 J- n+ E; W9 O& \$ w9 h$ c
(3)解决方案
% W+ n# B- s+ x4 y8 u9 _; J, m
这个地方我自己制作了一段一分钟左右的视频。一幅画面像素数300*260左右。这样在播放的时候,MATLAB只要准备6秒钟左右就可以。视频有500帧左右。
; B( G# K& t6 Y
. J$ |6 C' a, t% I( C2 i5 @1 p(4) movie(hf, mov, 1, video.FrameRate/3);
% P/ K2 z( j, a6 G" _# n4 v' n' M4 y. K% y5 Q: E
这个地方是播放视频。如果播放AVI视频的时候,不用除3。这个地方除3主要是因为视频时我自己做的。如果不除3,视频播放的帧速率过快,播放的视频和原视频的速度不匹配。
0 k2 l4 R9 j$ T; N" F
% d u) O1 e! K测试结果如下图:
1 b( l& {- ]: G" E8 j z; e
5 k2 V. J1 {4 u
) h6 b% T% @8 i
+ Q" o9 B C8 _2 h$ C; c( h) ?6 W' o9 F- M$ I5 i8 L& @9 p
[! T X9 P7 F; k7 u
演示视频在我的网盘里面:6 Q: I" V; S) x( \
7 H( _- k, N: H( I; Q
两个视频都小于5M.
4 \4 z0 E' D" ^" Y: c$ ~6 V& K/ A/ u
: E2 e+ ^3 z. g" t1 _. Y0 bMATLAB测试小视频:http://pan.baidu.com/s/1qWoamde3 D' z6 @; _' a# q& O5 o' Y
. v5 f) V$ O# H8 G2 W) WMATLAB程序读取WMV实际演示:http://pan.baidu.com/s/1pJ5Dj43- _" J- j/ }5 f# j
7 g7 z8 ?- O& F! I$ e: @9 ]- |9 T4 s! K6 V" y- k: ~3 {2 H6 s
- x3 W8 _8 J: n |
|