


 videoReader class constructor
   Creates a object that reads video streams.  We use a plugin 
   architecture in the backend to do the actual reading.  For example, 
   on Windows, DirectShow will typically be used and on Linux, the 
   ffmpeg library is often used.
   vr = videoReader(url)
     Opens the given video file for reading using the default plugin.
     On Windows, 'DirectShow' is used by default and on Linux,
     'ffmpegPopen2' is used by default.  For most plugins, the url will 
     really be a filename.
   vr = videoReader(url, ..., 'plugin',pluginName, ...)
   vr = videoReader(url,pluginName, ...)
     Opens the file using the manually specified plugin implementation.  
     Available plugins include:
     'DirectShow': preferred method on Windows
       - Only available on Windows
       - See INSTALL.dshow.txt for installation instructions
       - Can load virtually any video file that can be played in
         Microsoft's Windows Media Player.  Note that the correct codec
         must be installed to read a file.  For example, to read 
         tests/numbers.3ivx.avi, the user must have installed an MPEG4
         codec such as 3ivx (www.3ivx.com), DivX (www.divx.com), or XviD 
         (www.xvid.org).
       - The URL parameter should be a filename.
         - As a convenience, all forward slashes ('/') are automatically  
           converted to backslashes ('\')
     'ffmpegPopen2': safe method on Linux
       - Only supported on GNU/Linux (might work on BSD systems too like Mac 
         OS X, but this is untested)
       - See INSTALL.ffmpeg.txt for installation instructions
       - Creates a separate server process to communicate with the
         ffmpeg libraries.  
         - Works when the system's version of GCC is very different from
           the one that MathWorks used to compile Matlab.
         - Isolates ffmpeg errors so they typically cannot crash
           Matlab.  
         - May allow for more flexible distribution terms for your code 
           when it uses videoIO (ffmpeg may be compiled with either 
           the LGPL or GPL license).
     'ffmpegDirect': low-overhead method on Linux
       - same as ffmpegPopen2, but the ffmpeg libraries are loaded
         directly by the MEX file.
         - May not work if MathWorks' and your version of GCC are
           incompatible. 
         - Slightly faster than ffmpegPopen2 since there is no
           interprocess communication overhead.
   vr = videoReader(url, ..., param,arg,...)
     Allows the user to pass extra configuration arguments to plugin.
     Currently no plugin arguments are supported right now.  In the 
     future, we may allow the user to do things like have DirectShow
     automatically convert to grayscale, or give options to trade off 
     speed with seeking precision.
 
 Once you have created a videoReader object, you must next call NEXT,
 SEEK, or STEP at least once so that it will read some frame from disk.  
 *After* calling one of these methods, you may call GETFRAME as many 
 times as you would like and it will decode and return the current frame 
 (without advancing to a different frame).  GETINFO may be called at any 
 time (even before NEXT, SEEK, or STEP).  It returns basic information 
 about the video stream.  Once you are done using the videoReader, make 
 sure you call CLOSE so that any system resources allocated by the plugin 
 may be released.  Here's a simple example of how you might use
 videoReader: 
   % take us to the videoReader directory since we know there's a video
   % file there.  
   chdir(fileparts(which('videoReaderWrapper.cpp')));
   % Construct a videoReader object
   vr = videoReader('tests/numbers.uncompressed.avi');
   % Do some processing on the video and display the results
   avgIntensity = [];
   i = 1;
   figure;
   while (next(vr))
     img = getframe(vr);  
     avgIntensity(i) = mean(img(:));
     subplot(121); imshow(img);        title('current frame');
     subplot(122); plot(avgIntensity); title('avg. intensity vs. frame');
     drawnow;      pause(0.1);         i = i+1;
   end
   vr = close(vr);
 SEE ALSO:
   buildVideoMex
   videoReader/close
   videoReader/getframe
   videoReader/getinfo
   videoReader/getnext
   videoReader/next
   videoReader/seek
   videoReader/step
   videoWriter
Copyright (c) 2006 Gerald Dalley
See "MIT.txt" in the installation directory for licensing details (especially
when using this library on GNU/Linux).


0001 function vr = videoReader(url, varargin) 0002 % videoReader class constructor 0003 % Creates a object that reads video streams. We use a plugin 0004 % architecture in the backend to do the actual reading. For example, 0005 % on Windows, DirectShow will typically be used and on Linux, the 0006 % ffmpeg library is often used. 0007 % 0008 % vr = videoReader(url) 0009 % Opens the given video file for reading using the default plugin. 0010 % On Windows, 'DirectShow' is used by default and on Linux, 0011 % 'ffmpegPopen2' is used by default. For most plugins, the url will 0012 % really be a filename. 0013 % 0014 % vr = videoReader(url, ..., 'plugin',pluginName, ...) 0015 % vr = videoReader(url,pluginName, ...) 0016 % Opens the file using the manually specified plugin implementation. 0017 % Available plugins include: 0018 % 0019 % 'DirectShow': preferred method on Windows 0020 % - Only available on Windows 0021 % - See INSTALL.dshow.txt for installation instructions 0022 % - Can load virtually any video file that can be played in 0023 % Microsoft's Windows Media Player. Note that the correct codec 0024 % must be installed to read a file. For example, to read 0025 % tests/numbers.3ivx.avi, the user must have installed an MPEG4 0026 % codec such as 3ivx (www.3ivx.com), DivX (www.divx.com), or XviD 0027 % (www.xvid.org). 0028 % - The URL parameter should be a filename. 0029 % - As a convenience, all forward slashes ('/') are automatically 0030 % converted to backslashes ('\') 0031 % 0032 % 'ffmpegPopen2': safe method on Linux 0033 % - Only supported on GNU/Linux (might work on BSD systems too like Mac 0034 % OS X, but this is untested) 0035 % - See INSTALL.ffmpeg.txt for installation instructions 0036 % - Creates a separate server process to communicate with the 0037 % ffmpeg libraries. 0038 % - Works when the system's version of GCC is very different from 0039 % the one that MathWorks used to compile Matlab. 0040 % - Isolates ffmpeg errors so they typically cannot crash 0041 % Matlab. 0042 % - May allow for more flexible distribution terms for your code 0043 % when it uses videoIO (ffmpeg may be compiled with either 0044 % the LGPL or GPL license). 0045 % 0046 % 'ffmpegDirect': low-overhead method on Linux 0047 % - same as ffmpegPopen2, but the ffmpeg libraries are loaded 0048 % directly by the MEX file. 0049 % - May not work if MathWorks' and your version of GCC are 0050 % incompatible. 0051 % - Slightly faster than ffmpegPopen2 since there is no 0052 % interprocess communication overhead. 0053 % 0054 % vr = videoReader(url, ..., param,arg,...) 0055 % Allows the user to pass extra configuration arguments to plugin. 0056 % Currently no plugin arguments are supported right now. In the 0057 % future, we may allow the user to do things like have DirectShow 0058 % automatically convert to grayscale, or give options to trade off 0059 % speed with seeking precision. 0060 % 0061 % Once you have created a videoReader object, you must next call NEXT, 0062 % SEEK, or STEP at least once so that it will read some frame from disk. 0063 % *After* calling one of these methods, you may call GETFRAME as many 0064 % times as you would like and it will decode and return the current frame 0065 % (without advancing to a different frame). GETINFO may be called at any 0066 % time (even before NEXT, SEEK, or STEP). It returns basic information 0067 % about the video stream. Once you are done using the videoReader, make 0068 % sure you call CLOSE so that any system resources allocated by the plugin 0069 % may be released. Here's a simple example of how you might use 0070 % videoReader: 0071 % 0072 % % take us to the videoReader directory since we know there's a video 0073 % % file there. 0074 % chdir(fileparts(which('videoReaderWrapper.cpp'))); 0075 % 0076 % % Construct a videoReader object 0077 % vr = videoReader('tests/numbers.uncompressed.avi'); 0078 % 0079 % % Do some processing on the video and display the results 0080 % avgIntensity = []; 0081 % i = 1; 0082 % figure; 0083 % while (next(vr)) 0084 % img = getframe(vr); 0085 % avgIntensity(i) = mean(img(:)); 0086 % subplot(121); imshow(img); title('current frame'); 0087 % subplot(122); plot(avgIntensity); title('avg. intensity vs. frame'); 0088 % drawnow; pause(0.1); i = i+1; 0089 % end 0090 % vr = close(vr); 0091 % 0092 % SEE ALSO: 0093 % buildVideoMex 0094 % videoReader/close 0095 % videoReader/getframe 0096 % videoReader/getinfo 0097 % videoReader/getnext 0098 % videoReader/next 0099 % videoReader/seek 0100 % videoReader/step 0101 % videoWriter 0102 % 0103 %Copyright (c) 2006 Gerald Dalley 0104 %See "MIT.txt" in the installation directory for licensing details (especially 0105 %when using this library on GNU/Linux). 0106 0107 if (mod(length(varargin),2) == 0) 0108 plugin = defaultVideoIOPlugin; 0109 pluginArgs = varargin; 0110 else 0111 plugin = varargin{1}; 0112 pluginArgs = {varargin{2:end}}; 0113 end 0114 [plugin,pluginArgs] = parsePlugin(plugin, pluginArgs); 0115 0116 vr = struct('plugin',mexName(plugin), 'handle',int32(-1)); 0117 vr = class(vr, 'videoReader'); 0118 [pathstr, name, ext, versn] = fileparts(url); 0119 strArgs = cell(size(pluginArgs)); 0120 for i=1:numel(pluginArgs), strArgs{i} = num2str(pluginArgs{i}); end 0121 vr.handle = feval(vr.plugin, 'open', vr.handle, ... 0122 fullfile(pathstr,[name ext versn]), strArgs{:}); 0123 0124 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0125 function n = mexName(plugin) 0126 n = ['videoReader_' plugin]; 0127 0128 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0129 function [plugin,pluginArgs] = parsePlugin(plugin, pluginArgs) 0130 if (length(pluginArgs) > 0) 0131 [pluginSpecified,idx] = ismember('plugin', {pluginArgs{1:2:end}}); 0132 if pluginSpecified 0133 plugin = pluginArgs{idx*2}; 0134 pluginArgs = { pluginArgs{1:idx*2-2}, pluginArgs{idx*2+1:end} }; 0135 end 0136 end