我是很新的Matlab和我试图做一个程序,其中有3个按钮。
问题1:
按钮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);
好的,所以我的第一个问题是,当我运行这个代码时,我必须手动选择这个文件。我不太确定如何使它已经链接到文件,所以我需要帮助在这部分.
我的第二个问题其实是关于音频播放器..。对于Button 3来说,它实际上不起作用..。也不会播放任何声音。我以前尝试过sound (x,Fs)
,但是我在网上搜索,他们说我必须手动发出命令清晰的声音来阻止.wav文件的继续。
如何解决这个问题?因为我认为如果我在代码中使用第四个按钮:
stop(player)
这给了我一个错误。
发布于 2015-10-06 00:43:40
我的第一个答案是开始变得有点混乱,所以我将在这里张贴一个完全工作的简单例子。在这个GUI中,有3个pushButtons (播放、暂停和停止)和一个.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);
发布于 2015-10-02 04:07:42
您必须知道,您在回调函数中定义的变量没有存储,这就是为什么Button 3不能工作的原因。
-Have您尝试直接运行一个音频文件来检查它在编写GUI之前是否有效?
关于您尝试做的事情的-Several技巧:
1)如果不想手动选择文件,只需设置:
文件名=“.wav文件的完整路径”;
2)要构造包含完整路径(如果有FileName和PathName )的字符串,可以这样做:
FullPath=strcat(PathName,FileName);
3)按钮1和按钮2是什么样的按钮?为什么你需要按钮,如果它只是选择一个文件。我建议:
4)关于最后一个问题,也是因为变量不是在回调之间传递的,所以在Button4_Callback中,Matlab不知道变量'player‘。
当你回答我的问题^^时,我会发布更多的细节
编辑-关于您的评论:
( a)您不应该使用‘`function uipanel1_SelectionChangeFcn(hObject,eventdata,handles)'来调用您的代码,因为您只需单击Button3就可以完成所有操作。(函数Button3_Callback(hObject,eventdata,handles))
( b)我建议您为GUI元素提供自定义名称(在属性编辑器中更改标记属性),例如,Button3应该是“play”或类似的东西。(假设一个GUI有35个按钮,25个编辑字段等等,你很快就会迷路)
( 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);
注意,一旦回调停止执行,音频文件就会停止播放,所以您必须在那里使用一个小技巧,例如:thread/328757注意到,在执行回调后,您的player变量将被删除,因此您将无法再访问它。我建议您在handles对象中存储它的句柄。例如,可以在guidata(hObject,handles)
之前在GUI的开头函数中这样做,方法是添加如下内容:
handles.myPlayer=[];
然后在您的Button3_Callback函数中重写它
而不是写:player=audioplayer[x,Fs]
你可以选择:handles.myPlayer=audioplayer[x,Fs]
然后,您可以访问它来暂停/停止音频。
现在你还得:
https://stackoverflow.com/questions/32901413
复制