《实验4-MPEG编码.doc》由会员分享,可在线阅读,更多相关《实验4-MPEG编码.doc(5页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、精品文档,仅供学习与交流,如有侵权请联系网站删除实验4 MPEG编码1 实验目的本试验通过MATLAB编程实现MPEG标准的avi文件的编解码,了解MPEG标准的视频文件的前后帧图片差分编码及解码方法。2 实验步骤(1)首先设置8x8的离散余弦变换矩阵T、亮度维矩阵lighttable、色度为矩阵colortable以及64维向量sequence和sequence2;(2)获取avi文件信息,并读入该avi文件,设置图片分块的数量、每秒帧数、压缩、解压文件大小,以及参考帧等信息;(3)对avi文件进行前后帧图片差分编码及解码,包括DCT变换-量化-z字形编码-DC差分编码等以及DC差分编码-z
2、字形解码-反量化-DCT逆变换等;(4)保存编码、解码文件分别为mpegrar.mat和out.mat,并计算使用时间,将解码文件保存成out.avi文件,可以在MATLAB中观看保存的解码文件out.mat。3 MATLAB程序代码程序保存为mpeg_coding.m文件。【精品文档】第 5 页function mpeg_coding(filename)% MPEG压缩编码T=dctmtx(8);%Discrete cosine transform matrixlighttable=. 16 11 10 16 24 40 51 61; 12 12 14 19 26 58 60 55; 14
3、13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81 104 113 92; 49 64 78 87 103 121 120 101; 72 92 95 98 112 100 103 99;%亮度维colortable=. 17 18 24 47 99 99 99 99; 18 21 26 66 99 99 99 99; 24 26 56 99 99 99 99 99; 47 66 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 9
4、9 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; % 色度维sequence=1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 41 34 27 20 13 6 7 . 14 21 28 35 42 49 57 50 43 36 29 22 15 8 16 23 30 37 44 51 58 59 . 52 45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64;sequence2=1 3 4 10 11 21
5、22 36 2 5 9 12 20 23 35 37 6 8 13 19 24 34 . 38 49 7 14 18 25 33 39 48 50 15 17 26 32 40 47 51 58 16 27 31 41 . 46 52 57 59 28 30 42 45 53 56 60 63 29 43 44 54 55 61 62 64;tic; % Start a stopwatch timerinfor=aviinfo(filename) % Information about AVI filefs=infor.FramesPerSecond; % 每秒帧数fprintf(正在读取视频
6、. n);finput=aviread(filename); % 读入文件fprintf(读取视频完成. n);frame=length(finput);row,col,dim=size(finput(1).cdata);r=ceil(row/8); % 8*8块的数量c=ceil(col/8);mpegrar=int8(zeros(r*c,64,dim,frame); % 压缩文件大小定义output=uint8(zeros(row,col,dim,frame); % 解压文件大小定义imref=zeros(row,col,dim); % 参考帧% 前后帧图片差分编码fprintf(开始处理
7、视频. n);for(f=1:frame) pic=uint8(double(finput(f).cdata)-imref+255)./2); % pic为前后帧图片差 pic=rgb2ycbcr(pic); % 填补图片-行列转化为8的倍数 temp=mod(size(pic,1),8); if(temp=0) pic=pic;uint8(zeros(8-temp,size(pic,2),3); end temp=mod(size(pic,2),8); if(temp=0) pic=pic,uint8(zeros(size(pic,1),8-temp,3); end clear temp %
8、 每一维输入转化为(-128127) t1=double(pic(:,:,1)-27; t2=double(pic(:,:,2)-27; t3=double(pic(:,:,3)-27;% DCT变换-量化-z字形编码-DC差分编码 % % 处理亮度维 count=1; p1=int8(zeros(r*c,64); for(i=1:r) for(j=1:c) temp=round(T*t1(8*i-7:8*i,8*j-7:8*j)*T./lighttable); % DCT变换,量化 p1(count,:)=temp(sequence); % z字形编码 count=count+1; end
9、end p1(:,1)=p1(1);diff(p1(:,1); % DC系数差分编码 clear t1; % 处理色度维 count=1; p2=int8(zeros(r*c,64); for(i=1:r) for(j=1:c) temp=round(T*t2(8*i-7:8*i,8*j-7:8*j)*T./colortable); p2(count,:)=temp(sequence); count=count+1; end end p2(:,1)=p2(1);diff(p2(:,1); clear t2; % 处理色度维 count=1; p3=int8(zeros(r*c,64); for
10、(i=1:r) for(j=1:c) temp=round(T*t3(8*i-7:8*i,8*j-7:8*j)*T./colortable); p3(count,:)=temp(sequence); count=count+1; end end p3(:,1)=p3(1);diff(p3(:,1); clear t3; mpegrar(:,:,:,f)=cat(3,p1,p2,p3);%保存的内容 %DC系数差分解码 for(i=2:size(p1,1) p1(i,1)=p1(i-1,1)+p1(i,1); p2(i,1)=p2(i-1,1)+p2(i,1); p3(i,1)=p3(i-1,1
11、)+p3(i,1); end% z字形解码-反量化-DCT逆变换 % % 处理亮度维 count=1; t1=zeros(8*r,8*c); for(i=1:r) for(j=1:c) tmp=p1(count,:); tmp=reshape(tmp(sequence2),8,8); % z字形解码 t1(8*i-7:8*i,8*j-7:8*j)=T*(double(tmp).*lighttable)*T; % 反量化,DCT逆变换 count=count+1; end end clear p1; % 处理色度维 count=1; t2=zeros(8*r,8*c); for(i=1:r) f
12、or(j=1:c) tmp=p2(count,:); tmp=reshape(tmp(sequence2),8,8); t2(8*i-7:8*i,8*j-7:8*j)=T*(double(tmp).*colortable)*T; count=count+1; end end clear p2; % 处理色度维 count=1; t3=zeros(8*r,8*c); for(i=1:r) for(j=1:c) tmp=p3(count,:); tmp=reshape(tmp(sequence2),8,8); t3(8*i-7:8*i,8*j-7:8*j)=T*(double(tmp).*colo
13、rtable)*T; count=count+1; end end clear p3; % 每一维输出转化为(0255) t1=uint8(t1+27); t2=uint8(t2+27); t3=uint8(t3+27); pic=ycbcr2rgb(cat(3,t1,t2,t3); % ycbcr-rgb pic=pic(1:row,1:col,:); % 转化为原始图像大小 pic=double(pic)*2-255; imref=imref+pic; % 重新设定参考帧 output(:,:,:,f)=uint8(imref); % 解压内容 fprintf(完成进度 %1.2f %,f
14、/frame*100); % 输出进度 fprintf(n);endfprintf(处理视频完成. n);fprintf(开始保存文件. n);save mpegrar fs row col;save output;fprintf(保存文件完成. n);fprintf(压缩文件保存为 mpegrar.mat n);fprintf(解压文件保存为 output.mat n);fprintf(压缩解压共花费时间为 %f 秒n,toc);clear col row dim c r T colortable lighttable sequence sequence2;clear t1 t2 t3 mp
15、egrar finput pic imref;clear count temp tmp i j f filename infor;% 保存成avi格式 %fprintf(开始保存成avi文件. n);avifilename=output.avi;mov=avifile(avifilename,compression,Indeo5,fps,fs);for(i=1:frame) mov=addframe(mov,output(:,:,:,i);endmov=close(mov);fprintf(保存avi文件完成. n);fprintf(文件保存为 out.avi n);% 在Matlab中播放
16、%fprintf(按任意键观看视频. );pause();fprintf(n);choice=y;while(choice=y | choice=Y) for(i=1:frame) imshow(output(:,:,:,i); pause(1/4/fs); end close; choice=input(再看一次Y/N: ,s);end4 实验结果与分析在MATLAB的Command Window窗口下输入: mpeg_coding(D:test.avi)Command Window窗口输出显示为:infor = Filename: D:test.avi FileSize: 1128448
17、FileModDate: 29-六月-2011 22:25:29 NumFrames: 30 FramesPerSecond: 1 Width: 836 Height: 628 ImageType: truecolor VideoCompression: tscc Quality: 0 NumColormapEntries: 0 AudioFormat: PCM AudioRate: 8000 NumAudioChannels: 1正在读取视频. 读取视频完成. 开始处理视频. 完成进度 3.33 %完成进度 6.67 %完成进度 10.00 %完成进度 13.33 %完成进度 16.67 %
18、完成进度 20.00 %完成进度 23.33 %完成进度 26.67 %完成进度 30.00 %完成进度 33.33 %完成进度 36.67 %完成进度 40.00 %完成进度 43.33 %完成进度 46.67 %完成进度 50.00 %完成进度 53.33 %完成进度 56.67 %完成进度 60.00 %完成进度 63.33 %完成进度 66.67 %完成进度 70.00 %完成进度 73.33 %完成进度 76.67 %完成进度 80.00 %完成进度 83.33 %完成进度 86.67 %完成进度 90.00 %完成进度 93.33 %完成进度 96.67 %完成进度 100.00
19、%处理视频完成. 开始保存文件. 保存文件完成. 压缩文件保存为 mpegrar.mat 解压文件保存为 output.mat 压缩解压共花费时间为 170.965912 秒开始保存成avi文件. 保存avi文件完成. 文件保存为 out.avi 按任意键观看视频. 再看一次Y/N: y再看一次Y/N: n由于不同的机器硬件配置不同,对该实验的处理速度也不同,并且实验的对象文件test.avi的大小也有一定的限制,否则会出现内存空间不够的错误。应当注意的是,由于编解码算法的不同,在MATLAB下观看out.mat解码文件和通过视频播放器观看out.avi文件的效果是不同的。通过本实验可以了解MPEG标准的编解码规范,为以后学习实现其他编解码标准打下基础。