videoWriter class constructor Creates a object that writes video files. We use a plugin architecture in the backend to do the actual writing. For example, on Windows, DirectShow will typically be used and on Linux, the ffmpeg library is often used. vw = videoWriter(url) Opens the given video file for writing 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. vw = videoWriter(url,..., 'plugin',pluginName, ...) vw = videoWriter(url,pluginName) Opens the file using the specified plugin implementation. Available plugins include: 'DirectShow': preferred method on Windows - Only available on Windows - See INSTALL.dshow.txt for installation instructions - 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. vw = videoWriter(url, ..., param,arg,...) Allows the user to pass extra configuration arguments to plugin. At present, all parameter names are case sensitive (but in the future they may become case-insensitive). The following parameters are supported by current plugins: Plugin Parameter ffmpeg* DShow Implementation Notes --------- ------- ----- ----------------------------- width X X Width of the encoded video. Most codecs require width to be divisible by 2, 4, or 8. Most users will want to explicitly pass this parameter. The addframe method will automatically resize any images according to the value chosen here (or a default value if none is specified here). height X X Height of the encoded video. Most codecs require height to be divisible by 2, 4, or 8. Most users will want to explicitly pass this parameter. The addframe method will automatically resize any images according to the value chosen here (or a default value if none is specified here). codec X X A string specifying the encoder to use. The exact set of possible codecs is highly system-dependent. Most users will want to explicitly pass this parameter. To see a list of available codecs on a specific machine, run: codecs = videoWriter([],'codecs'); fourcc X For the DirectShow plugin, this is a synonym for 'codec'. fps X X Frame rate of the recorded video. Note that some codecs only work with some frame rates. 15, 24, 25, 29.97, and 30 should work with most codecs. framesPerSecond X X An alias for fps. fpsNum, fpsDenom X X This pair of parameters allows frames per second to be specified as a rational number. Either both or neither parameter must be given. framesPerSecond_num Alias for fpsNum, fpsDenom pair. framesPerSecond_denom X X bitRateTolerance X For supporting codecs, the actual bit rate is allowed to vary by +/- this value. showCompressionDialog X If true (a non-zero number), a dialog box is presented to the user allowing precise manual selection of the codec and its parameters. Note: sometimes the dialog does not received focus automatically so you'll need to ALT-TAB to get to it. codecParams X A MIME Base64-encoded string describing the codec setup parameters for a DirectShow codec. The contents of this string are very codec-specific. Often, The best ways to come up with a string like this are to first create a videoWriter with the 'showCompressionDialog' option enabled, choose the desired settings, then use the GETINFO method to extract the 'codecParams' value. Note that this representation is the same as used by VirtualDub 1.6 and 1.7 in its Sylia Script files. Nearly all useful DirectShow codecs can only be configured with 'codecParams' and they ignore the separate 'bitRate' and 'gopSize' parameters given below. bitRate X x Target bits/sec of the encoded video. Supported by most ffmpeg codecs. To see whether a particular codec uses the bitRate parameter, run the testBitRate function in the tests/ subdirectory (NOTE: very few DirectShow codecs support it). gopSize X x Maximum period between keyframes. GOP stands for "group of pictures" in MPEG lingo. Supported by most ffmpeg codecs. To see whether a particular codec uses the gopSize parameter, run the testGopSize function in the tests/ subdirectory (NOTE: very few DirectShow codecs support it). maxBFrames X For MPEG codecs, gives the max number of bidirectional frames in a group of pictures (GOP). codecs = videoWriter([],'codecs') codecs = videoWriter([],pluginName,'codecs') codecs = videoWriter([],'codecs','plugin',pluginName) Queries the backend for a list of the valid codecs that may be used with the 'codec' plugin parameter. Once you are done using the videoWriter, 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 videoWriter to create a video of continually adding more motion blur to an image: % Construct a videoWriter object vw = videoWriter('writertest.avi', ... 'width',320, 'height',240, 'codec','xvid'); img = imread('peppers.png'); h = fspecial('motion',10,5); for i=1:100 addframe(vw, img); img = imfilter(img, h); end vw=close(vw); SEE ALSO: buildVideoMex videoWriter/addframe videoWriter/close videoReader 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 vw = videoWriter(url, varargin) 0002 % videoWriter class constructor 0003 % Creates a object that writes video files. We use a plugin 0004 % architecture in the backend to do the actual writing. For example, 0005 % on Windows, DirectShow will typically be used and on Linux, the 0006 % ffmpeg library is often used. 0007 % 0008 % vw = videoWriter(url) 0009 % Opens the given video file for writing 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 % vw = videoWriter(url,..., 'plugin',pluginName, ...) 0015 % vw = videoWriter(url,pluginName) 0016 % Opens the file using the 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 % - The URL parameter should be a filename. 0023 % - As a convenience, all forward slashes ('/') are automatically 0024 % converted to backslashes ('\') 0025 % 0026 % 'ffmpegPopen2': safe method on Linux 0027 % - Only supported on GNU/Linux (might work on BSD systems too like Mac 0028 % OS X, but this is untested) 0029 % - See INSTALL.ffmpeg.txt for installation instructions 0030 % - Creates a separate server process to communicate with the 0031 % ffmpeg libraries. 0032 % - Works when the system's version of GCC is very different from 0033 % the one that MathWorks used to compile Matlab. 0034 % - Isolates ffmpeg errors so they typically cannot crash 0035 % Matlab. 0036 % - May allow for more flexible distribution terms for your code 0037 % when it uses videoIO (ffmpeg may be compiled with either 0038 % the LGPL or GPL license). 0039 % 0040 % 'ffmpegDirect': low-overhead method on Linux 0041 % - same as ffmpegPopen2, but the ffmpeg libraries are loaded 0042 % directly by the MEX file. 0043 % - May not work if MathWorks' and your version of GCC are 0044 % incompatible. 0045 % - Slightly faster than ffmpegPopen2 since there is no 0046 % interprocess communication overhead. 0047 % 0048 % vw = videoWriter(url, ..., param,arg,...) 0049 % Allows the user to pass extra configuration arguments to plugin. 0050 % At present, all parameter names are case sensitive (but in the 0051 % future they may become case-insensitive). 0052 % 0053 % The following parameters are supported by current plugins: 0054 % 0055 % Plugin 0056 % Parameter ffmpeg* DShow Implementation Notes 0057 % --------- ------- ----- ----------------------------- 0058 % width X X Width of the encoded video. Most 0059 % codecs require width to be divisible 0060 % by 2, 4, or 8. Most users will want 0061 % to explicitly pass this parameter. 0062 % The addframe method will 0063 % automatically resize any images 0064 % according to the value chosen here 0065 % (or a default value if none is 0066 % specified here). 0067 % 0068 % height X X Height of the encoded video. Most 0069 % codecs require height to be divisible 0070 % by 2, 4, or 8. Most users will want 0071 % to explicitly pass this parameter. 0072 % The addframe method will 0073 % automatically resize any images 0074 % according to the value chosen here 0075 % (or a default value if none is 0076 % specified here). 0077 % 0078 % codec X X A string specifying the encoder to 0079 % use. The exact set of possible 0080 % codecs is highly system-dependent. 0081 % Most users will want to explicitly 0082 % pass this parameter. To see a list 0083 % of available codecs on a specific 0084 % machine, run: 0085 % codecs = videoWriter([],'codecs'); 0086 % 0087 % fourcc X For the DirectShow plugin, this is a 0088 % synonym for 'codec'. 0089 % 0090 % fps X X Frame rate of the recorded video. 0091 % Note that some codecs only work with 0092 % some frame rates. 15, 24, 25, 29.97, 0093 % and 30 should work with most codecs. 0094 % 0095 % framesPerSecond X X An alias for fps. 0096 % 0097 % fpsNum, fpsDenom X X This pair of parameters allows frames 0098 % per second to be specified as a 0099 % rational number. Either both or 0100 % neither parameter must be given. 0101 % 0102 % framesPerSecond_num Alias for fpsNum, fpsDenom pair. 0103 % framesPerSecond_denom 0104 % X X 0105 % 0106 % bitRateTolerance X For supporting codecs, the actual 0107 % bit rate is allowed to vary by +/- 0108 % this value. 0109 % 0110 % showCompressionDialog X If true (a non-zero number), a dialog 0111 % box is presented to the user allowing 0112 % precise manual selection of the codec 0113 % and its parameters. Note: sometimes 0114 % the dialog does not received focus 0115 % automatically so you'll need to 0116 % ALT-TAB to get to it. 0117 % 0118 % codecParams X A MIME Base64-encoded string describing 0119 % the codec setup parameters for a 0120 % DirectShow codec. The contents of this 0121 % string are very codec-specific. Often, 0122 % The best ways to come up with a string 0123 % like this are to first create a 0124 % videoWriter with the 0125 % 'showCompressionDialog' option enabled, 0126 % choose the desired settings, then use 0127 % the GETINFO method to extract the 0128 % 'codecParams' value. Note that this 0129 % representation is the same as used by 0130 % VirtualDub 1.6 and 1.7 in its Sylia 0131 % Script files. Nearly all useful 0132 % DirectShow codecs can only be 0133 % configured with 'codecParams' and they 0134 % ignore the separate 'bitRate' and 0135 % 'gopSize' parameters given below. 0136 % 0137 % bitRate X x Target bits/sec of the encoded video. 0138 % Supported by most ffmpeg codecs. 0139 % To see whether a particular codec uses 0140 % the bitRate parameter, run the 0141 % testBitRate function in the tests/ 0142 % subdirectory (NOTE: very few DirectShow 0143 % codecs support it). 0144 % 0145 % gopSize X x Maximum period between keyframes. GOP 0146 % stands for "group of pictures" in MPEG 0147 % lingo. Supported by most ffmpeg 0148 % codecs. To see whether a particular 0149 % codec uses the gopSize parameter, run 0150 % the testGopSize function in the tests/ 0151 % subdirectory (NOTE: very few DirectShow 0152 % codecs support it). 0153 % 0154 % maxBFrames X For MPEG codecs, gives the max 0155 % number of bidirectional frames in a 0156 % group of pictures (GOP). 0157 % 0158 % codecs = videoWriter([],'codecs') 0159 % codecs = videoWriter([],pluginName,'codecs') 0160 % codecs = videoWriter([],'codecs','plugin',pluginName) 0161 % Queries the backend for a list of the valid codecs that may be used 0162 % with the 'codec' plugin parameter. 0163 % 0164 % Once you are done using the videoWriter, make sure you call CLOSE so 0165 % that any system resources allocated by the plugin may be released. 0166 % Here's a simple example of how you might use videoWriter to create 0167 % a video of continually adding more motion blur to an image: 0168 % 0169 % % Construct a videoWriter object 0170 % vw = videoWriter('writertest.avi', ... 0171 % 'width',320, 'height',240, 'codec','xvid'); 0172 % img = imread('peppers.png'); 0173 % h = fspecial('motion',10,5); 0174 % for i=1:100 0175 % addframe(vw, img); 0176 % img = imfilter(img, h); 0177 % end 0178 % vw=close(vw); 0179 % 0180 % SEE ALSO: 0181 % buildVideoMex 0182 % videoWriter/addframe 0183 % videoWriter/close 0184 % videoReader 0185 % 0186 %Copyright (c) 2006 Gerald Dalley 0187 %See "MIT.txt" in the installation directory for licensing details (especially 0188 %when using this library on GNU/Linux). 0189 0190 if (numel(url)==0) 0191 % static method call 0192 if (mod(length(varargin),2) == 0) 0193 plugin = varargin{1}; 0194 staticMethod = varargin{2}; 0195 methodArgs = {varargin{3:end}}; 0196 else 0197 plugin = defaultVideoIOPlugin; 0198 staticMethod = varargin{1}; 0199 methodArgs = {varargin{2:end}}; 0200 end 0201 [plugin,methodArgs] = parsePlugin(plugin, methodArgs); 0202 0203 vw = feval(mexName(plugin), staticMethod, int32(-1), methodArgs{:}); 0204 0205 else 0206 % constructor call 0207 if (mod(length(varargin),2) == 0) 0208 plugin = defaultVideoIOPlugin; 0209 pluginArgs = varargin; 0210 else 0211 plugin = varargin{1}; 0212 pluginArgs = {varargin{2:end}}; 0213 end 0214 plugin = parsePlugin(plugin, pluginArgs); 0215 0216 vw = struct('plugin',mexName(plugin), 'handle',int32(-1), ... 0217 'w',int32(-1), 'h',int32(-1)); 0218 vw = class(vw, 'videoWriter'); 0219 [pathstr, name, ext, versn] = fileparts(url); 0220 strArgs = cell(size(pluginArgs)); 0221 for i=1:numel(pluginArgs), strArgs{i} = num2str(pluginArgs{i}); end 0222 [vw.handle,vw.w,vw.h] = feval(vw.plugin, 'open', vw.handle, ... 0223 fullfile(pathstr,[name ext versn]), ... 0224 strArgs{:}); 0225 end 0226 0227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0228 function n = mexName(plugin) 0229 n = ['videoWriter_' plugin]; 0230 0231 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0232 function [plugin,pluginArgs] = parsePlugin(plugin, pluginArgs) 0233 if (length(pluginArgs) > 0) 0234 [pluginSpecified,idx] = ismember('plugin', {pluginArgs{1:2:end}}); 0235 if pluginSpecified 0236 plugin = pluginArgs{idx*2}; 0237 pluginArgs = { pluginArgs{1:idx*2-2}, pluginArgs{idx*2+1:end} }; 0238 end 0239 end