⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmread.m

📁 mmread funtion In MATLAB code format
💻 M
📖 第 1 页 / 共 2 页
字号:
                warning('Audio data format not recognized/supported, it probably is going to be useless.');
            end

            % reshape the data so that it is nrChannels x Samples.  This should be the same output as wavread.
            audio(i).data = reshape(d,nrChannels,length(d)/nrChannels)';
        end

        FFGrab('cleanUp');
    catch
        try
            err = lasterror;
            if ~isempty(strfind(err.message,'libavbin'))
                switch mexext
                    case 'mexa64'
                        if strfind(err.message,'No such file')
                            if exist('libavbin.so.64','file')
                                if exist('libavbin.so','file')
                                    d64=dir('libavbin.so.64');
                                    d=dir('libavbin.so');
                                    if d.bytes ~= d64.bytes
                                        R=input('libavbin.so is installed but seems to be the 32bit version.\nShall I correct this (no admin required)? [Y/n]','s');
                                        if ~isequal(R,'n') & ~isequal(R,'N')
                                            if copyfile('libavbin.so.64','libavbin.so','f')
                                                error('libavbin.so installed.  You may need to restart Matlab for mmread to function.');
                                            else
                                                error('libavbin.so failed to install:  couldn''t write to libavbin.so');
                                            end
                                        end
                                    end
                                else
                                    R=input('libavbin.so needs to be installed.\nShall I install this for you (no admin required)? [Y/n]','s');
                                    if ~isequal(R,'n') && ~isequal(R,'N')
                                        if copyfile('libavbin.so.64','libavbin.so','f')
                                            error('libavbin.so installed.  You may need to restart Matlab for mmread to function.');
                                        else
                                            error('libavbin.so failed to install:  couldn''t write to libavbin.so');
                                        end
                                    end
                                end
                            end
                        end
                    case 'mexglx'
                        if strfind(err.message,'No such file')
                            if exist('libavbin.so.32','file')
                                if exist('libavbin.so','file')
                                    d32=dir('libavbin.so.32');
                                    d=dir('libavbin.so');
                                    if d.bytes ~= d32.bytes
                                        R=input('libavbin.so is installed but seems to be the 64bit version.\nShall I correct this (no admin required)? [Y/n]','s');
                                        if ~isequal(R,'n') && ~isequal(R,'N')
                                            if copyfile('libavbin.so.32','libavbin.so','f')
                                                error('libavbin.so installed.  You may need to restart Matlab for mmread to function.');
                                            else
                                                error('libavbin.so failed to install:  couldn''t write to libavbin.so');
                                            end
                                        end
                                    end
                                else
                                    R=input('libavbin.so needs to be installed.\nShall I install this for you (no admin required)? [Y/n]','s');
                                    if ~isequal(R,'n') && ~isequal(R,'N')
                                        if copyfile('libavbin.so.32','libavbin.so','f')
                                            error('libavbin.so installed.  You may need to restart Matlab for mmread to function.');
                                        else
                                            error('libavbin.so failed to install:  couldn''t write to libavbin.so');
                                        end
                                    end
                                end
                            end
                        end
                    case {'mexmac', 'mexmaci', 'mexmaci64'}
                        R=input('libavbin.dylib needs to be installed.\nShall I install this for you (no admin required)? [Y/n]','s');
                        if ~isequal(R,'n') && ~isequal(R,'N')
                            if ~exist('~/lib','dir')
                                if ~mkdir('~/lib')
                                    error('A lib directory doesn''t exist in your home directory, and one couldn''t be created.');
                                end
                            end
                            if copyfile('libavbin.dylib','~/lib/libavbin.dylib','f')
                                error('libavbin.dylib installed.  You may need to restart Matlab for mmread to function.');
                            else
                                error('libavbin.dylib failed to install:  couldn''t write to libavbin.dylib');
                            end
                        end
                end
            end
            try
                FFGrab('cleanUp');
            catch
            end
            rethrow(err);
        catch
            if ~strmatch(computer,'PCWIN')
                cd(currentdir);
            end
            rethrow(lasterror);
        end
    end
    if ~strmatch(computer,'PCWIN')
        cd(currentdir);
    end
else
    try
        mexDDGrab('buildGraph',filename);
        if (isempty(time))
            mexDDGrab('setFrames',frames);
        else
            if (numel(time) ~= 2)
                error('time must be a vector of length 2: [startTime stopTime]');
            end
            mexDDGrab('setTime',time(1),time(2));
        end
        if (disableVideo)
            mexDDGrab('disableVideo');
        end;
        if (disableAudio | nargout < 2)
            mexDDGrab('disableAudio');
        end;
        mexDDGrab('setMatlabCommand',matlabCommand);

        mexDDGrab('setTrySeeking',double(trySeeking));

        try
            mexDDGrab('doCapture');
        catch
            err = lasterror;
            if (~strcmp(err.identifier,'processFrame:STOP'))
                rethrow(err);
            end
        end

        [nrVideoStreams, nrAudioStreams] = mexDDGrab('getCaptureInfo');

        video = struct('width',{},'height',{},'nrFramesTotal',{},'frames',{});
        audio = struct('nrChannels',{},'rate',{},'bits',{},'nrFramesTotal',{},'data',{},'frames',{});

        warned = false;

        % we can only get the video frames if we don't process a matlabCommand
        if strcmp(matlabCommand,'')
            % loop through getting all of the video data from each stream
            for i=1:nrVideoStreams
                [width, height, rate, nrFramesCaptured, nrFramesTotal, totalDuration] = mexDDGrab('getVideoInfo',i-1);
                video(i).width = width;
                video(i).height = height;
                video(i).rate = rate;
                video(i).nrFramesTotal = nrFramesTotal;
                video(i).totalDuration = totalDuration;
                video(i).frames = struct('cdata',cell(1,nrFramesCaptured),'colormap',cell(1,nrFramesCaptured));
                video(i).times = zeros(size(video(i).frames));
                video(i).skippedFrames = [];

                if (nrFramesTotal > 0 && any(frames > nrFramesTotal))
                    warning('mmread:general',['Frame(s) ' num2str(frames(frames>nrFramesTotal)) ' exceed the number of frames in the movie.']);
                end

                scanline = ceil(width*3/4)*4; % the scanline size must be a multiple of 4.

                for f=1:nrFramesCaptured
                    [data, time] = mexDDGrab('getVideoFrame',i-1,f-1);

                    if (numel(data) ~= scanline*height)
                        if (numel(data) > 3*width*height)
                            if (~warned)
                                warning('mmread:general','dimensions do not match data size. Guessing badly...');
                                warned = true;
                            end
                            scanline = width*3;
                            data = data(1:3*width*height);
                        else
                            if (f == 1)
                                error('dimensions do not match data size. Too little data.');
                            else
                                warning(['dimensions do not match data size. Too little data for ' num2str(f) 'th frame.']);
                                continue;
                            end
                        end
                    end

                    % if there is any extra scanline data, remove it
                    data = reshape(data,scanline,height);
                    data = data(1:3*width,:);

                    % the data ordering is wrong for matlab images, so permute it
                    tmp = permute(reshape(data, 3, width, height),[3 2 1]);
                    % the images are also upside down and colors were backwards.
                    video(i).frames(f).cdata = tmp(end:-1:1,:,3:-1:1);
                    video(i).times(f) = time;
                end

                framerate = (max(video(i).times)-min(video(i).times))/nrFramesCaptured;
                if framerate > 0
                    video(i).skippedFrames = any(diff(video(i).times)>framerate*1.8) & abs(mean(diff(video(i).times))-framerate)/framerate<0.05;
                end

                % if frames are specified then make sure that the order is the same
                if (~isempty(frames) && nrFramesCaptured > 0)
                    [uniqueFrames, dummy, frameOrder] = unique(frames);
                    if (length(uniqueFrames) > nrFramesCaptured)
                        warning('mmread:general','Not all frames specified were captured.  Returning what was captured, but order may be different than specified.');
                        remainingFrames = frames(frames<=uniqueFrames(nrFramesCaptured));
                        [dummy, dummy, frameOrder] = unique(remainingFrames);
                    end

                    video(i).frames = video(i).frames(frameOrder);
                    video(i).times = video(i).times(frameOrder);
                end
            end
        end

        % loop through getting all of the audio data from each stream
        for i=1:nrAudioStreams
            [nrChannels, rate, bits, nrFramesCaptured, nrFramesTotal, subtype, totalDuration] = mexDDGrab('getAudioInfo',i-1);
            audio(i).nrChannels = nrChannels;
            audio(i).rate = rate;
            audio(i).bits = bits;
            audio(i).nrFramesTotal = nrFramesTotal;
            audio(i).totalDuration = totalDuration;
            audio(i).frames = cell(1,nrFramesCaptured);
            for f=1:nrFramesCaptured
                [data, time] = mexDDGrab('getAudioFrame',i-1,f-1);
                audio(i).frames{f} = data;
                audio(i).times(f) = time;
            end
            % combine the data across frames
            d = double(cat(1,audio(i).frames{:}));

            % rescale the data so that it is between -1.0 and 1.0
            if (subtype==0)
                %PCM formated data...
                switch (bits)
                    case {4, 8}
                        d = (d-2^(bits-1))/2^(bits-1);
                    case {16, 24, 32}
                        d = d/2^(bits-1);
                end
            elseif (subtype==1)
                if (bits == 32)
                    %IEEE FLOAT formated data...
                    if (max(d) > 1 | min(d) < -1)
                        % there are two float formats one that is already -1 to 1
                        % and the there is between -2^15 to 2^15
                        d = d / 2^15;
                    end
                else
                    warning('Audio data format not recognized/supported, it probably is going to be useless.');
                end
            else
                warning('Audio data format not recognized/supported, it probably is going to be useless.');
            end

            % reshape the data so that it is nrChannels x Samples.  This should be the same output as wavread.
            audio(i).data = reshape(d,nrChannels,length(d)/nrChannels)';
        end

        mexDDGrab('cleanUp');
    catch
        err = lasterror;
   %     mexDDGrab('cleanUp');
        if strfind(err.message,'combination')
            disp('The ''No combination of intermediate filters could be found to make the connection'' error');
            disp('means that no appropriate codec could be found.  Mpg2 files seem to be the worst.  ');
            disp('Installing ffdshow (www.free-codecs.com/FFDShow_download.htm) often fixes this problem. ');
        end
        rethrow(err);
    end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -