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

📄 mplay.m

📁 基于MATLAB的媒体播放器
💻 M
📖 第 1 页 / 共 4 页
字号:
        % not in reverse ... decrement
        if ud.currframe <= stepsize,
            ud.fbrev=1;  % hit reverse playback
            ud.currframe = stepsize+1;  % so next subtraction brings us to frame 1
        end
        ud.currframe = ud.currframe-stepsize;
    end
else
    % Not fwd/back mode    
    
    ud.currframe = ud.currframe - stepsize;
    % Check for backwards wraparound
    if ud.currframe < 1,
        if ~ud.loopmode,
            if ud.currframe == 1-stepsize,
                return
            end
            ud.currframe = 1;
        else
            ud.currframe = ud.currframe+ud.numFrames;
        end
    end
end

% Store for next time:
ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1;  % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end

% --------------------------------------------------------
function cb_play(hbutton, eventStruct, hfig)
% Play button callback

if nargin<3, hfig  = gcbf; end

ud    = get(hfig,'userdata');
icons = get_icons_from_fig(hfig);
hPlay = findobj(ud.htoolbar, 'tag','Play/Pause');

% Check if timer is already running
if strcmp(get(ud.htimer,'Running'),'on'),
    % Movie already playing
    %  - Move to Pause mode
    %  - Show Play icon (currently must be pause indicator)
    
    % Stop timer, set pause mode
    ud.paused = 1;
    set(hfig,'userdata',ud);
    stop(ud.htimer);
    
    % Flush changes
    ShowMovieFrame(hfig);
    %UpdateFrameReadout(ud);

    % Set play icon, darker
    set(hPlay, ...
        'tooltip', 'Resume', ...
        'cdata', icons.play_off);
else
    % Not running
    if ud.paused,
        % Paused - move to play
        ud.nextframe = ud.currframe;
    else
        % Stopped - move to play
        ud.nextframe = 1;  % Start from 1st frame when stopped
        ud.fbrev     = 0;  % Reset fwd/bkwd state to fwd
    end
    set(hfig,'userdata',ud);
    
    % Show pause icon
    set(hPlay, ...
        'tooltip', 'Pause', ...
        'cdata', icons.pause_default);
    start(ud.htimer);
end
UpdateGUIControls(hfig);

% --------------------------------------------------------
function cb_stop(hbutton, eventStruct, hfig)
% Stop button callback

if nargin<3, hfig  = gcbf; end

ud = get(hfig,'userdata');
ud.paused = 0;  % we're stopped, not paused
set(hfig,'userdata',ud);

isRunning = strcmp(get(ud.htimer,'Running'),'on');
if isRunning,
    stop(ud.htimer);
else
    % Allow stop even when movie not running
    % We could have been paused
    do_timer_stop(hfig);
end

% --------------------------------------------------------
function cb_step_back(hbutton, eventStruct, hfig)
% Step one frame backward callback

if nargin<3, hfig  = gcbf; end
ud = get(hfig,'userdata');

if ud.fbmode,
    % fwd/back playback mode
    if ud.fbrev,
        % in reverse ... increment
        if ud.currframe == ud.numFrames-1,
            % will hit last frame ... go to normal playback
            ud.fbrev=0;  % normal playback
        end
        ud.currframe = ud.currframe+1;
    else
        % not in reverse ... decrement
        if ud.currframe == 1,
            % fwd/back hit when frame 2 displayed
            %   move to frame 1 in non-reverse mode, then go to reverse
            %   mode
            ud.fbrev=1;  % enter reverse playback
            ud.currframe = 2;
        else
            ud.currframe = ud.currframe-1;
        end
    end
else
    % Not fwd/back mode    
    if ud.currframe <= 1,
        if ~ud.loopmode,
            return
        end
        ud.currframe = ud.numFrames;
    else
        ud.currframe = ud.currframe-1;
    end
end

ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1;  % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end

% --------------------------------------------------------
function cb_step_fwd(hbutton, eventStruct, hfig)
% Step one frame forward callback

% If in fwdbk mode,
%   Ignore looping mode
%   We always go from fwd to bkwd when step_fwd pressed at last frame
%   When we're at frame 1, we must continue to frame 2 regardless of the
%   looping setting since we don't know "how" we got there

if nargin<3, hfig  = gcbf; end
ud = get(hfig,'userdata');

if ud.fbmode,
    % fwd/back playback mode
    if ~ud.fbrev,
        % not in reverse ... increment fwd
        if ud.currframe >= ud.numFrames,
            % hit last frame ... go to reverse
            ud.currframe = ud.currframe-1;
            ud.fbrev=1;  % reverse playback
        else
            ud.currframe = ud.currframe+1;
        end
    else
        % in reverse ... decrement
        if ud.currframe == 2,
            % fwd/back hit when frame 2 displayed
            %   move to frame 1 in reverse mode
            ud.fbrev=0;  % no more reverse playback
        end
        ud.currframe = ud.currframe-1;
    end
else
    % Not fwd/back mode    
    if ud.currframe >= ud.numFrames,
        if ~ud.loopmode,
            return
        end
        ud.currframe = 1;
    else
        ud.currframe = ud.currframe+1;
    end
end

ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1;  % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end

% --------------------------------------------------------
function cb_ffwd(hbutton, eventStruct, hfig)
% Fast forward button callback
if nargin<3, hfig  = gcbf; end
ud = get(hfig,'userdata');
stepsize = 10;

if ud.fbmode,
    % In fwd/rev playback mode
    if ~ud.fbrev,
        % not in reverse ... increment fwd
        if ud.currframe >= ud.numFrames-stepsize,
            % hit last frame ... go to reverse
            ud.currframe = ud.numFrames;
            ud.fbrev=1;  % reverse playback
        else
            ud.currframe = ud.currframe+stepsize;
        end
    else
        % in reverse mode
        if ud.currframe <= stepsize,
            ud.fbrev=0;  % no more reverse playback
            ud.currframe = stepsize+1;  % so next subtraction brings us to frame 1
        end
        ud.currframe = ud.currframe-stepsize;
    end
else
    % Not in fwd/rev playback mode
    ud.currframe = ud.currframe + stepsize;
    if ud.currframe > ud.numFrames,
        if ~ud.loopmode,
            if ud.currframe == ud.numFrames+stepsize,
                return
            end
            ud.currframe = ud.numFrames;
        else
            ud.currframe = ud.currframe-ud.numFrames;
        end
    end
end

ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1;  % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end

% --------------------------------------------------------
function cb_goto_end(hbutton, eventStruct, hfig)
% Goto end button callback
%
% NOTE: For fwd/bkwd mode, goes to last frame as usual,
% and enters bkwd playback.  No special code needed.

if nargin<3, hfig  = gcbf; end
ud = get(hfig,'userdata');
if ud.currframe ~= ud.numFrames,
    ud.currframe = ud.numFrames;
    ud.nextframe = ud.currframe;
    set(hfig,'userdata',ud);
    ShowMovieFrame(hfig);
end

% --------------------------------------------------------
function cb_loop(hbutton, eventStruct, hfig)
% Loop button callback
% Store loopmode state
if nargin<3, hfig  = gcbf; end
ud = get(hfig,'userdata');
ud.loopmode = ~ud.loopmode;
set(hfig,'userdata',ud);

ReactToStoredLoopMode(hfig);


% --------------------------------------------------------
function cb_fbmode(hbutton, eventStruct, hfig)
% Fwd/Bkwd playback button callback
% Store state
if nargin<3, hfig  = gcbf; end
ud = get(hfig,'userdata');
ud.fbmode = ~ud.fbmode;
ud.fbrev  = 0; % Reset direction when fb status changes
set(hfig,'userdata',ud);

ReactToStoredFBMode(hfig);

% --------------------------------------------------------
function cb_truesize(hco, eventStruct, hfig)

if nargin<3, hfig=gcbf; end
SetupMovieFrame(hfig);

% --------------------------------------------------------
function ReactToStoredLoopMode(hfig)

icons = get_icons_from_fig(hfig);
ud = get(hfig,'userdata');
if ud.loopmode,
    icon = icons.loop_on;
    tip = 'Repeat: On';
else
    icon = icons.loop_off;
    tip = 'Repeat: Off';
endhLoopButton = findobj(hfig,'tag','loopbutton');
set(hLoopButton,'cdata',icon,'tooltip',tip);

% --------------------------------------------------------
function ReactToStoredFBMode(hfig)

% Update button icon/tip
icons = get_icons_from_fig(hfig);
ud = get(hfig,'userdata');
if ud.fbmode,
    icon = icons.fwdbk_play_on;
    tip = 'Forward/backward playback';
else
    icon = icons.fwdbk_play_off;
    tip = 'Normal playback';
end
hFBButton = findobj(hfig,'tag','fbbutton');
set(hFBButton,'cdata',icon,'tooltip',tip);

% Update frame readout and tooltip
UpdateFrameReadout(ud);
UpdateFrameReadoutTooltip(ud);

% --------------------------------------------------------
function [r,c,f] = MovieSizeInfo(A, fmt)
% Determine rows, columns, and frames for each movie format
%                 'S'    Standard Movie structure
%                 'I'    MxNxF
%                 'RGB'  MxNx3xF

switch fmt
    case 'I'
        r=size(A,1);
        c=size(A,2);
        f=size(A,3);
    case 'RGB'
        r=size(A,1);
        c=size(A,2);
        f=size(A,4);
    case 'S'
        r=size(A(1).cdata,1);
        c=size(A(1).cdata,2);
        f=length(A);
end

% --------------------------------------------------------
function LoadMovie(hfig, A, fmt, varname, fps)

% Store basic movie info:
%
ud = get(hfig,'userdata');
ud.MovieFormat = fmt;
ud.Movie     = A;
ud.fps       = fps;
ud.varName   = varname;
[r,c,f]      = MovieSizeInfo(A,fmt);
ud.frameRows = r;
ud.frameCols = c;
ud.numFrames = f;
ud.currframe = 1;
ud.nextframe = 1;

% Store data, set name in figure title
set(hfig, ...
    'userdata', ud, ...
    'name', sprintf('Movie Player: %s', ud.varName));

% Update viewer
%
set(hfig,'name', sprintf('Movie Player: %s', ud.varName));
SetupUpdateFunction(hfig);    % Select playback function
SetupMovieFrame(hfig);        % Shrink figure to movie size
SetupTimer(hfig);             % Updates FPS status readout via SetFPS
ShowMovieFrame(hfig);         % Updates frame counter status readout
UpdateFrameSizeReadout(hfig); % Updates frame size readout
ReactToStoredLoopMode(hfig);  % Initial update of button icon
ReactToStoredFBMode(hfig);    % Initial update of button icon

% --------------------------------------------------------
function SetupMovieFrame(hfig)
% Sets up frame sizes, window sizes, etc
% Leaves existing image in display

ud = get(hfig,'userdata');
rows=ud.frameRows;
cols=ud.frameCols;

% Adjust image limits and axis limits appropriately
set(ud.himage,'xdata', 1:cols, 'ydata', 1:rows);
% Do a "truesize" like operation
set(ud.haxis, ...
    'xlim',[1 cols], ...
    'ylim',[1 rows], ...
    'units','pix', ...
    'pos',[1 1 cols rows]);

% Set figure to be an exact fit around the axis
set(ud.hfig,'units','pix');
figpos = get(ud.hfig,'pos');
newpos = [figpos(1:2) cols rows];
set(ud.hfig,'pos',newpos);

set(ud.haxis,'units','norm');  % allow stretching again


% --------------------------------------------------------
function ShowMovieFrame(hfig, fast)

% Update video image
ud = get(hfig,'userdata');
feval(ud.UpdateImageFcn, ud);

% Update frame counter
if (nargin > 1) && fast,

⌨️ 快捷键说明

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