【问题标题】:Matlab Questions about Audioplayer GUIMatlab 关于 Audioplayer GUI 的问题
【发布时间】:2015-10-06 17:03:18
【问题描述】:

我对 Matlab 很陌生,我正在尝试制作一个有 3 个按钮的程序。

问题一:

按钮 1 将链接到音频文件 (.wav) 所以当我按下它时,按钮 1 将“选择”第一个音频文件。

按钮 2 将链接到另一个音频文件 (.wav) 所以当我按下它时,按钮 2 将“选择”第二个音频文件。

然后,我需要按按钮 3 来播放所选的声音文件,这取决于我先按哪个按钮(按钮 1/按钮 2)

所以我当前的代码是这样的:
按钮 1 和 2:

[FileName,PathName] = uigetfile({'*.wav'},'Load Wav File');
[x,Fs] = wavread([PathName '/' FileName]);

按钮 3:

player = audioplayer(x,Fs);
play(player);

好的,所以我的第一个问题是,当我运行这段代码时,我必须手动选择文件。我不太确定如何让它已经链接到文件,所以我需要这方面的帮助......

我的第二个问题实际上是关于音频播放器... 对于按钮 3,它实际上不起作用......并且没有播放任何声音。 我之前尝试过sound (x,Fs),但我在网上搜索,他们说我必须手动发出命令清除声音以阻止 .wav 文件继续。

如何解决这个问题?因为我想如果我在代码中使用第四个按钮:

stop(player)

它给了我一个错误。

【问题讨论】:

    标签: matlab audio


    【解决方案1】:

    -首先你必须知道你在回调函数中定义的变量没有被存储,这就是你的按钮 3 不起作用的原因。

    -您是否尝试过在对 GUI 进行编程之前直接运行音频文件以检查它是否有效?

    -关于您正在尝试做的事情的几个提示:

    1) 如果不想手动选择文件,只需设置:

    filename='.wav 文件的完整路径';

    2) 如果你有 FileName 和 PathName,要构造包含完整路径的字符串,你可以这样做:

    FullPath=strcat(PathName,FileName);
    

    3) 按钮 1 和按钮 2 是什么类型的按钮?如果只是为了选择一个文件,为什么需要按钮。我建议:

    • 单选按钮:在这种情况下会更加直观,而且您可以在 Button3_Callback 中以编程方式获取它们的状态以读取正确的 .wav
    • ListBox :如果您计划能够轻松添加读取更多 .wav 文件而无需更改 GUI 的可能性,这很有用。

    4)关于你的最后一个问题,这又是由于回调之间没有传输变量,所以在你的 Button4_Callback 中,Matlab 不知道变量'player'。

    当您回答我的问题时,我会发布更多详细信息^^

    编辑 - 关于您的评论:

    a) 你不应该使用 `function uipanel1_SelectionChangeFcn(hObject, eventdata, handles)' 来调用你的代码,因为你可以通过点击 Button3 来做任何事情。 (function Button3_Callback(hObject,eventdata,handles))

    b) 我建议您为您的 GUI 元素提供自定义名称(在属性编辑器中更改 Tag 属性),例如 Button3 将是“播放”或类似的名称。 (想象一个带有 35 个按钮、25 个编辑字段等的 GUI,你很快就会迷失方向)

    c) Button3_Callback 看起来像:

    %Know which radiobutton is selected
    
    Value_radiobutton1=get(handles.radiobutton1,'value'); %Returns 1 if radiobutton1 is checked, 0 if not
    
    Value_radiobutton2=get(handles.radiobutton2,'value'); %Same as above but for radiobutton2
    
    %Now that you have the information :
    
    if(Value_radiobutton1)
    
    % play first .wav
    
    FullPath='C:\Users\Y400\Documents\MATLAB\test1';
    
    [x,Fs]=wavread(FullPath);
    
    handles.myPlayer = audioplayer(x,Fs);
    
    play(handles.myPlayer);
    
    
    
    else
    
    % play second.wav
    
    end
    
    %store your handles again to keep track of your audioplayer.
    
    guiData(hObject,handles);
    

    请注意,一旦回调停止执行,音频文件就会停止播放,因此您必须在此处使用一些小技巧,例如: http://www.mathworks.com/matlabcentral/newsreader/view_thread/328757 另请注意,执行回调后,您的播放器变量将被删除,因此您将无法再访问它。我建议您将其句柄存储在 handles 对象中。例如,这可以在 guidata(hObject,handles) 之前的 GUI 的打开功能中通过添加类似的内容来完成:

    handles.myPlayer=[];
    

    然后在 Button3_Callback 函数中覆盖它

    而不是写:player=audioplayer[x,Fs]

    你去:handles.myPlayer=audioplayer[x,Fs]

    然后,您可以访问它来暂停/停止音频。

    现在你仍然必须:

    • 想办法让音乐停止播放(点击按钮?播放按钮相同?)
    • 防止用户同时选中两个单选按钮
    • 防止用户在未选中单选按钮的情况下按下按钮 3 (可以禁用 button3 直到选中单选按钮,或者默认选中其中一个单选按钮,由您选择)。

    【讨论】:

    • 我之前在使用sound (x,Fs) 时尝试过运行音频文件`我将在星期一尝试 1 和 2。我也会尝试单选按钮 感谢您的建议
    • 嗨,很抱歉延迟了您的建议>。程序:`function uipanel1_SelectionChangeFcn(hObject, eventdata, handles) switch get(eventdata.NewValue,'Tag'); case 'radiobutton1' test1 = 'C:\Users\Y400\Documents\MATLAB\test1' FullPath1 = strcat('C:\Users\Y400\Documents\MATLAB','test1'); [y,Fs] = load('C:\Users\Y400\Documents\MATLAB\test1'); [y,Fs] = wavread;结束'
    • 嘿,你为什么在函数 uipanel1_SelectionChangeFcn(hObject, eventdata, handles) 中这样做?最好在 Button3_Callback(hObject,eventdata,handles) (用户按下 Button3 时调用的函数)中执行此操作。然后,您的 strcat 调用中缺少一个 \ 。无论如何,您要么像以前那样以编程方式获取 Filename 和 PathName,要么像使用 test1 一样直接输入它。
    • 感谢您的快速回复!
    • 1.找到一种让音乐停止播放的方法(单击按钮?播放按钮相同?)-> 我也需要帮助 >.我设法通过使用按钮组解决了这个问题) 3.防止用户在没有检查单选按钮的情况下按下按钮3(可能通过禁用按钮3直到单选按钮选中,或默认选中其中一个单选按钮,您的选择)。 -> 它将选择 1 个按钮(无法取消选择)
    【解决方案2】:

    我的第一个答案开始有点混乱,所以我将在这里发布一个完整的简单示例。在这个 GUI 中,有 3 个按钮(播放、暂停和停止),以及一个播放的 .wav 文件(piano2.wav)。

    function varargout = AudioTest(varargin)
    
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @AudioTest_OpeningFcn, ...
                       'gui_OutputFcn',  @AudioTest_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%      Opening function       %%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    
    
    function AudioTest_OpeningFcn(hObject, eventdata, handles, varargin)
    
    
    handles.output = hObject;
    handles.myPlayer=[];
    
    % Update handles structure
    
    guidata(hObject, handles);
    
    
    
    
    
    function varargout = AudioTest_OutputFcn(hObject, eventdata, handles) 
    
    
    varargout{1} = handles.output;
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%  Executed on press of Play button   %%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    function Play_Callback(hObject, eventdata, handles)
    
    [x,Fs]=wavread('piano2.wav');
    handles.myPlayer=audioplayer(x,Fs);
    play(handles.myPlayer);
    guidata(hObject,handles);
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%  Executed on press of Pause button   %%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    function Pause_Callback(hObject, eventdata, handles)
    
    
    pause(handles.myPlayer);
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%  Executed on press of Stop button   %%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    
    function Stop_Callback(hObject, eventdata, handles)
    
    stop(handles.myPlayer);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2013-01-22
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多