mmread.m
上传用户:limilano
上传日期:2013-07-02
资源大小:19k
文件大小:5k
源码类别:

视频捕捉/采集

开发平台:

Matlab

  1. function [video, audio] = mmread(filename, frames, disableVideo, disableAudio)
  2. % function [video, audio] = mmread(filename, frames, disableVideo, disableAudio)
  3. % mmread reads virtually any media file.  If Windows Media Play can play
  4. % it, so should mmread.  It uses the Window's DirectX infrastructure to
  5. % render the media, so other OSs are out of luck.
  6. %
  7. % INPUT
  8. % filename      input file to read (mpg, avi, wmv, asf, wav, mp3, ...)
  9. % frames        specifies which video frames to capture, default [] for all
  10. % disableVideo  disables ALL video capturing, to save memory or time
  11. % disableAudio  disables ALL audio capturing, to save memory or time
  12. %
  13. % OUTPUT
  14. % video is a struct with the following fields:
  15. %   width           width of the video frames
  16. %   height          height of the video frames
  17. %   nrFramesTotal   the total number of frames in the movie regardless to
  18. %                   how many were captured
  19. %   frames          a struct array with the following fields:
  20. %       cdata       [height X width X 3] uint8 matricies
  21. %       colormap    always empty
  22. %
  23. % audio is a struct with the following fields:
  24. %   nrChannels      the number of channels in the audio stream (1 or 2)
  25. %   rate            sampling rate of the audio, ex. 44100
  26. %   bits            bit depth of the samples (8 or 16)
  27. %   data            the real data of the whole audio stream.  This can be
  28. %                   played using wavplay.
  29. %   nrFramesTotal   Audio comes in packets or frames when captured, the
  30. %   frames          division of the audio into frames may or may not make
  31. %                   sense.  Probably not of great use.  Stored as uint8s.
  32. %
  33. % If there is no video or audio stream the corresponding structure will be
  34. % empty.
  35. %
  36. % Specifying frames does not effect audio capturing.  If you want only a
  37. % subsection of the audio you will need to extract it from the matrix
  38. % yourself.
  39. %
  40. % If there are multiple video or audio streams, then the structure will be
  41. % of length > 1.  For example: audio(1).data and audio(2).data.
  42. %
  43. % EXAMPLES
  44. % [video, audio] = mmread('chimes.wav');
  45. % wavplay(audio.data,audio.rate);
  46. %
  47. % video = mmread('mymovie.mpg');
  48. % movie(video.frames);
  49. %
  50. % video = mmread('mymovie.mpg',1:10); %get only the first 10 frames
  51. %
  52. % video = mmread('mymovie.mpg',[],false,true); %read all frames, disable audio
  53. %
  54. % Written by Micah Richert
  55. if nargin < 4
  56.     disableAudio = false;
  57.     if nargin < 3
  58.         disableVideo = false;
  59.         if nargin < 2
  60.             frames = [];
  61.         end
  62.     end
  63. end
  64. try
  65.     mexDDGrab('buildGraph',filename);
  66.     mexDDGrab('setFrames',frames);
  67.     if (disableVideo) mexDDGrab('disableVideo'); end;
  68.     if (disableAudio || nargout < 2) mexDDGrab('disableAudio'); end;
  69.     mexDDGrab('doCapture');
  70.     
  71.     [nrVideoStreams, nrAudioStreams] = mexDDGrab('getCaptureInfo');
  72.     
  73.     video = struct('width',{},'height',{},'nrFramesTotal',{},'frames',{});
  74.     audio = struct('nrChannels',{},'rate',{},'bits',{},'nrFramesTotal',{},'data',{},'frames',{});
  75.     
  76.     % loop through getting all of the video data from each stream
  77.     for i=1:nrVideoStreams
  78.         [width, height, nrFramesCaptured, nrFramesTotal] = mexDDGrab('getVideoInfo',i-1);
  79.         video(i).width = width;
  80.         video(i).height = height;
  81.         video(i).nrFramesTotal = nrFramesTotal;
  82.         video(i).frames = struct('cdata',repmat({[]},1,nrFramesCaptured),'colormap',repmat({[]},1,nrFramesCaptured));
  83.         for f=1:nrFramesCaptured
  84.             data = mexDDGrab('getVideoFrame',i-1,f-1);
  85.             % the data ordering is wrong for matlab images, so permute it
  86.             tmp = permute(reshape(data, 3, width, height),[3 2 1]);
  87.             video(i).frames(f).cdata = tmp(end:-1:1,:,3:-1:1); % the images are also upside down and colors were backwards.
  88.         end
  89.     end
  90.     
  91.     % loop through getting all of the audio data from each stream
  92.     for i=1:nrAudioStreams
  93.         [nrChannels, rate, bits, nrFramesCaptured, nrFramesTotal] = mexDDGrab('getAudioInfo',i-1);
  94.         audio(i).nrChannels = nrChannels;
  95.         audio(i).rate = rate;
  96.         audio(i).bits = bits;
  97.         audio(i).nrFramesTotal = nrFramesTotal;
  98.         audio(i).frames = cell(1,nrFramesCaptured);
  99.         for f=1:nrFramesCaptured
  100.             data = mexDDGrab('getAudioFrame',i-1,f-1);
  101.             audio(i).frames{f} = data;
  102.         end
  103.         % combine the data across frames
  104.         d = double(cat(1,audio(i).frames{:}));
  105.         % convert to 16 bit if need be
  106.         if (bits == 16) d = d(1:2:end)+d(2:2:end)*256; end;
  107.         % make the data signed
  108.         d(d>2^(bits-1)) = d(d>2^(bits-1)) - 2^bits;
  109.         % reshape and rescale the data so that it is nrChannels x Samples
  110.         % and -1.0 to 1.0.  This should be the same output as wavread.
  111.         audio(i).data = reshape(d/2^(bits-1),nrChannels,length(d)/nrChannels)';
  112.     end
  113.     
  114.     mexDDGrab('cleanUp');
  115. catch
  116.     err = lasterror;
  117.     mexDDGrab('cleanUp');
  118.     rethrow(err);
  119. end