|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在视频处理方向,一般使用硬件进行处理。当然使用MATLAB进行仿真处理,可以做到方面、节约时间、节省开支等。基于此,本程序在MATLAB实现正常的读取WMV格式的视频,并进行播放。目前还没有加视频处理算法。视频数据能够读取出来,还没有进行处理。# ~( S; L+ a! L2 Y1 f9 f' P A% T
9 N* Z2 }9 Q3 \% k0 c5 \" m( n
MATLAB程序如下:3 e* x* }- E! g5 v [2 q/ t# P
. P% j; ^$ Y2 E%{) h: w1 h1 v, {$ j( [
主题:使用matlab2010播放WMV视频; b) V8 C5 x- `2 T$ h
使用范围:( V! Y) a/ L) o: O, l0 m
可以用于视频处理。在硬件实现视频处理之前,首先使用MATLAB对
& J' E* R3 V* y7 W# V4 Q+ J; w算法进行仿真。这样可以及时的发现问题,避免不必要的开支。+ B+ p$ p2 F8 a5 q3 }
制作:天空之恋0 N* q5 f; _7 M) S$ o
地点:桂电
, I7 K$ g$ O& s( i5 |时间:
9 Q: \+ i p/ U; W* k) Z0 }+ h3 {说明:参考VideoReader标准使用方法: z G5 ~& j" P' T( k) `
%}
' z; _1 T. d# K8 q" z7 h, c& d%清除所有变量
9 E7 v) m. R9 G; A* ^/ W. z/ |%读取视频文件
1 v% n' R# D* _2 R& R' fvideo=VideoReader('test6.wmv');%此处使用mmreader()函数读取视频也可以。% o. d6 s" M2 q: a, K2 z
% 读取视频中所有数据 V' ^5 d7 h. G. S
vidFrames = read(video);. j \8 W: T: v: V( Q* N% Z
%读取视频的帧的个数7 T A+ ~, ]6 d8 l2 C( Q* a
numFrames = get(video, 'numberOfFrames');%获得总的视频帧的个数
0 _" B9 c: }, f%从视频帧数据中创建一个MATLAB视频播放结构体
2 \5 x$ L, t; g; a' v# O2 c! G: ^ for k = 1 : numFrames 7 t. {% t& r) n
mov(k).cdata = vidFrames(:,:,:,k);
9 ~! y% d; w5 R2 k %{
; o0 i$ P1 ]9 m. u) u %---------亮点,处理程序都可以放在这里了。。
+ u' v) y5 b& [& Q %这段程序是将视频转换成灰度图像,也就是彩色电视变成黑白电视: R9 s% H0 A3 q
a=vidFrames(:,:,1,k);
1 t7 y! L1 O6 \ b=vidFrames(:,:,2,k);* V k! }; m* h9 h) o/ [8 W: z
c=vidFrames(:,:,3,k);
: J) [. |! X2 s d=0.299*a+0.587*b+0.114*c;' ^: ?! @6 [- R7 t
mov(k).cdata=cat(3,d,d,d);
! C7 S! g! o/ _, t) I: ? mov(k).colormap = []; . z' D* r0 e5 A, M0 y0 Y B% U8 U" ^
%} # J' W* r- q6 O0 G: c! X6 N( L& B$ Z
end - H0 t! k; Q* L( W6 B
hf=figure;%创建图像
3 e% L# d' `% A2 E8 @, a- g, [. C8 O %基于视频的宽度和高度重建图片- g2 W) X2 h9 V q
set(hf, 'position', [150 150 video.Width video.Height])
: v; r, a+ X% u; A- w %按照视频帧速率重播视频
' v/ r2 o" P0 j, X; A movie(hf, mov, 1, video.FrameRate/3);%这个地方为什么要除3请看下面解释。
) A4 g5 E! V* h7 N L
8 x" f) N2 z5 w8 l问题:- r+ b5 _6 I# s1 ]0 M
6 ?" N8 L6 g, ?: g9 M(1)读取WMV格式的视频MATLAB总是要有一个警告:
- l$ \2 z# d) q/ T, M- u) c- I* J" G T3 l1 ^. d5 o) |% D
Warning: Unable to determine the number of frames in this file. 8 P0 j0 P v' [9 _
x3 T# `6 w0 H" D
其实,这个警告是说不能确定视频帧的个数(能不确定帧的个数,也就不知道视频时间是多长,这个可能是个BUG吧,不懂。读取AVI视频的时候没有这个警告)。这个警告可以忽略,因为最终我们还是可以正常播放视频。5 h; m+ Z' L5 K- B3 M* U: E
( V4 S! }1 X+ e. C9 s& `(2)视频大小问题4 \& c1 P( g6 q5 q/ T1 v+ [
1 Z* W: z4 s, C# Z& P
最开始我播放一个4分钟左右标准的WMV个数的视频(像素1024*768)。使用笔记本电脑读的视频的时候,电脑发热直接死机了。使用老式的台式机读取的时候,读了一分钟左右才能正常的播放视频。对于用MATLAB播放更长视频的,感觉就是找死了。; n7 u! `; u+ g% i" g+ i& D; H! s
5 F+ ~9 ~# g/ h D分析:MATLAB应该是首先读取视频总的帧的个数,可能是为了确定视频的总时长吧。视频一幅画面像素数越多、时间越长,MATLAB播放视频准备时间就越长(要等1分钟左右)。
& _; s5 U, w7 p2 c, K( V, b% D M' w3 @ D' [
(3)解决方案
3 k# H& r) n3 B. S
* n$ K5 T( R: ?) p) {这个地方我自己制作了一段一分钟左右的视频。一幅画面像素数300*260左右。这样在播放的时候,MATLAB只要准备6秒钟左右就可以。视频有500帧左右。5 {2 {4 T+ u0 J# M( u# X+ }6 h
h0 m9 Q9 L; R* v3 x. v6 } k
(4) movie(hf, mov, 1, video.FrameRate/3);9 `6 q; i% U( G: G+ f: L s+ d
) @. B7 D- _- w2 `" l: Q8 _% f这个地方是播放视频。如果播放AVI视频的时候,不用除3。这个地方除3主要是因为视频时我自己做的。如果不除3,视频播放的帧速率过快,播放的视频和原视频的速度不匹配。
7 r# h6 c5 X- O# R# y s+ U& {3 G1 j4 {: K+ @ w0 F
测试结果如下图:# `, w4 U1 x, [6 n4 g w
/ C% [! W% z0 f! e# r9 p1 \6 b7 |
0 g' }8 l9 d9 l+ q* S, q' g3 B0 ?# S
- _. x+ ]) t7 N2 C+ q& ~3 m* T# J+ j$ u- |
演示视频在我的网盘里面:5 {5 S+ }/ y7 `6 w. G' M5 x
# Z" Z6 ]; \9 f$ N5 A
两个视频都小于5M." h" x r8 k; h& v
2 ~, h( Q$ @/ l; [9 WMATLAB测试小视频:http://pan.baidu.com/s/1qWoamde3 Z1 {) T! X: g% g( x
8 E3 Y1 D6 n; C3 NMATLAB程序读取WMV实际演示:http://pan.baidu.com/s/1pJ5Dj43+ M% j1 h$ c: z: n0 {
. i0 _; P) y5 f9 ~# X
0 [) i# Z! B J+ P4 B# C X4 f& t0 f9 `( H9 f& C) [
|
|