|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在视频处理方向,一般使用硬件进行处理。当然使用MATLAB进行仿真处理,可以做到方面、节约时间、节省开支等。基于此,本程序在MATLAB实现正常的读取WMV格式的视频,并进行播放。目前还没有加视频处理算法。视频数据能够读取出来,还没有进行处理。+ f% P6 x/ N7 t) z/ w! ^3 v
L2 B1 c! ^8 i# b5 Q$ A) q: C
MATLAB程序如下:
1 b5 x' p/ E/ ]8 t) ~ R9 [
) O5 E9 `+ M8 I' W%{0 b( H+ T. Z P
主题:使用matlab2010播放WMV视频. l" f* h2 G5 h: C4 p3 r# \
使用范围:
. I: w7 r3 Y3 v! X& G# k4 h可以用于视频处理。在硬件实现视频处理之前,首先使用MATLAB对
7 p% g k5 r9 z8 \% [* H算法进行仿真。这样可以及时的发现问题,避免不必要的开支。; B, j; T9 Z; q8 k. S5 l0 m) u' n
制作:天空之恋
4 Y( w, v+ P6 H% k地点:桂电
$ c! { O6 d$ G时间:: U$ m4 M! U4 z7 [$ I) j# J. L
说明:参考VideoReader标准使用方法% e. x' J7 \) D0 z/ }
%}
$ K- r8 h" h% [%清除所有变量2 N) w4 O0 B5 @" `& X0 x: M9 l
%读取视频文件3 L8 H! W: x5 A+ g p
video=VideoReader('test6.wmv');%此处使用mmreader()函数读取视频也可以。- G& a/ }4 W9 r$ _) U
% 读取视频中所有数据
% h o3 V4 H7 avidFrames = read(video);
7 [) b9 [+ r! ^% w; [%读取视频的帧的个数
; c, Q o0 U& j- l. _9 L' `$ `numFrames = get(video, 'numberOfFrames');%获得总的视频帧的个数! I. ~- N. w9 L$ P C5 d3 z2 Z
%从视频帧数据中创建一个MATLAB视频播放结构体+ y4 P3 g( Q2 [
for k = 1 : numFrames 3 Q5 q3 w/ V' Z, W1 l+ W
mov(k).cdata = vidFrames(:,:,:,k);# h; N, y8 H: z" G7 H9 e6 F& M
%{0 n1 Q' B" A( i" [- s
%---------亮点,处理程序都可以放在这里了。。
& _, Q* C: s4 I7 l1 o %这段程序是将视频转换成灰度图像,也就是彩色电视变成黑白电视) \; e$ S) n% `
a=vidFrames(:,:,1,k);
, \9 G* M( J7 ^ b=vidFrames(:,:,2,k);
5 `- Y# a# Z* H/ a c=vidFrames(:,:,3,k);
5 V; u- l( | [( j& u. z# J3 O9 F d=0.299*a+0.587*b+0.114*c;& I! O' X+ ^* P" @$ r
mov(k).cdata=cat(3,d,d,d); - s" \8 i) E. x5 ^9 a% c7 P3 d
mov(k).colormap = []; $ P% z j: w" b" [$ U
%}
4 D( ~4 B9 F0 P end ; A( S, ^+ R; s% m& v
hf=figure;%创建图像
) W; i4 W/ Y: ?% V %基于视频的宽度和高度重建图片' P! ~3 O4 p& c" R
set(hf, 'position', [150 150 video.Width video.Height])& I# U: f/ ?$ L7 ~
%按照视频帧速率重播视频; Z9 X" l5 b8 A5 b5 A0 u( _% e
movie(hf, mov, 1, video.FrameRate/3);%这个地方为什么要除3请看下面解释。
6 |# J& i: ^$ o7 e: c- Q6 D: g$ r, ?. L3 w* u
问题:" `! |! l& Z R
8 O, {1 L1 `" x* W/ }. K w(1)读取WMV格式的视频MATLAB总是要有一个警告:- |; G5 l+ V* v" v
) Q6 i8 _; ~, UWarning: Unable to determine the number of frames in this file. " X" c1 R" D) V# u, R
, v, U8 p2 d7 @" h, d0 g
其实,这个警告是说不能确定视频帧的个数(能不确定帧的个数,也就不知道视频时间是多长,这个可能是个BUG吧,不懂。读取AVI视频的时候没有这个警告)。这个警告可以忽略,因为最终我们还是可以正常播放视频。6 m1 V3 e6 d7 G0 Z
" Y0 M& r! v8 X5 }(2)视频大小问题; c* T; G& Z' D; s0 N" S( S' X
* A, |* B& W! y% \5 s! v$ Z
最开始我播放一个4分钟左右标准的WMV个数的视频(像素1024*768)。使用笔记本电脑读的视频的时候,电脑发热直接死机了。使用老式的台式机读取的时候,读了一分钟左右才能正常的播放视频。对于用MATLAB播放更长视频的,感觉就是找死了。( i) K% U- q$ o$ v
: m8 a! q" R& G+ B% o) u( Z' `
分析:MATLAB应该是首先读取视频总的帧的个数,可能是为了确定视频的总时长吧。视频一幅画面像素数越多、时间越长,MATLAB播放视频准备时间就越长(要等1分钟左右)。
( ]# `! ` K! x* R2 S U( }% [
% E1 ?/ R8 a$ M(3)解决方案6 ?/ S9 M7 g) r: d0 J) f+ B% X1 d
7 z: ]5 j! O1 n7 d0 E) `
这个地方我自己制作了一段一分钟左右的视频。一幅画面像素数300*260左右。这样在播放的时候,MATLAB只要准备6秒钟左右就可以。视频有500帧左右。
# v9 v/ v: C) K# c- n1 ~- Y4 o# z |, Y2 n2 V- T2 s; @
(4) movie(hf, mov, 1, video.FrameRate/3);2 _0 D" v r3 T0 z0 E0 d8 M" s, N
9 |" M+ o: X" s# n这个地方是播放视频。如果播放AVI视频的时候,不用除3。这个地方除3主要是因为视频时我自己做的。如果不除3,视频播放的帧速率过快,播放的视频和原视频的速度不匹配。7 L$ r/ w( S! a4 b- b
. P/ L `9 c8 S
测试结果如下图:
8 Q$ W( n! \. U5 Z2 q0 U4 u u5 v5 g7 ] w' m9 M
4 G9 X+ z3 d2 D2 L2 [$ b2 y/ E; y0 R/ e
! | D8 Z. C. C5 S9 [. n
: F7 W u. n' C1 D5 k' ^演示视频在我的网盘里面:
9 @$ t: u* d" E3 e9 u
0 e( |0 {1 f2 X7 Z2 k; j两个视频都小于5M.5 u. R# N8 J/ J9 a3 m7 S
% s9 |: F; k1 ^* E( G8 s% yMATLAB测试小视频:http://pan.baidu.com/s/1qWoamde
% a( R. j7 g* Q( V
3 U4 o" Y) |% ~3 d' M7 s0 uMATLAB程序读取WMV实际演示:http://pan.baidu.com/s/1pJ5Dj436 s. E/ m, y3 _* z: T; ?" A
" [) ~; S/ }5 r" b! k
6 H) `* ?/ Q! x3 }; [
- i7 q* x# X% e1 N, C% [ |
|