iOS audio playback can be divided into short audio playback (e.g., audio effects, etc.) and long audio playback (for example: music and other main audio). The former does not need to control the progress, cycle, etc., while the latter requires precise control. Playing these two audio in iOS is done using Audiotoolbox.frameworK and Avfoundation.framework respectively.
Short Audio Sound
Audiotoolbox.framework is a C-based framework that uses it to play the sound effect by registering short audio with the system sound service. The System Sound Service is a simple, low-level voice playback service, but it also has some limitations:
No longer than seconds in duration (play time less than 30s)
In linear PCM or IMA4 (IMA/ADPCM) format (data must be in PCM or IMA4 format)
Packaged in a .caf
, .aif
or file .wav
(the audio file must be packaged as a. caf,.aif,.wav file)
The steps to play the sound using the system voice Service are as follows (encapsulated as a tool class for playing short audio):
+ (void) Initialize {//load all audio files//1. Traverse all the audio files of the Plane.bundleNsfilemanager *manage =[Nsfilemanager Defaultmanager]; //2. Obtained the path of the Plane.bundleNSString *planepath = [[NSBundle mainbundle] Pathforresource:@"Plane.bundle"Oftype:nil]; Nsarray*contents =[Manage Contentsofdirectoryatpath:planepath error:nil]; //3. Traverse the MP3 file inside to create the Systemsoundid;Nsmutabledictionary *SOUNDDICTM =[Nsmutabledictionary dictionary]; for(NSString *soundnameinchcontents) { //the URL of the audioNSString *soundurlpath =[Planepath Stringbyappendingpathcomponent:soundname]; Nsurl*soundurl =[Nsurl Fileurlwithpath:soundurlpath]; Systemsoundid Soundid; //Create a soundAudioservicescreatesystemsoundid (__bridge cfurlref) Soundurl, &Soundid); Sounddictm[soundname]=@ (Soundid); } sounddict=SOUNDDICTM;}- (void) Playshortsoundwithname: (NSString *) Soundname {//Play SoundAudioservicesplaysystemsound ([Sounddict[soundname] unsignedintvalue]);}
Long audio playback (implemented using Avfoundation.framework's Avaudioplayer)
The use of Avaudioplayer is relatively simple:
- Initializes the Avaudioplayer object, which typically specifies a local file path.
- Sets the properties of the player, such as number of repetitions, volume, and so on.
- Call the play method to play.
Property |
Description |
@property (readonly, getter=isplaying) BOOL playing |
Is playing, read-only |
@property (readonly) Nsuinteger Numberofchannels |
Number of audio channels, read-only |
@property (readonly) nstimeinterval duration |
Audio duration |
@property (readonly) Nsurl *url |
Audio file path, read-only |
@property (readonly) NSData *data |
Audio data, read-only |
@property Float pan |
Stereo balance, if 1.0 is the full left channel, if 0.0 is the left and right channel balance, if 1.0 is exactly |
@property Float Volume |
Volume size, Range 0-1.0 |
@property BOOL Enablerate |
Whether the playback rate is allowed to change |
@property Float Rate |
Playback rate, range 0.5-2.0, if 1.0 is playing normally, if you want to modify the playback rate you must set Enablerate to Yes |
@property Nstimeinterval CurrentTime |
Current playback duration |
@property (readonly) Nstimeinterval Devicecurrenttime |
The output device plays the audio time, note that if the playback is paused this time will also continue to accumulate |
@property Nsinteger Numberofloops |
Loop the number of times, if 0 does not loop, if less than 0 infinite loop, greater than 0 indicates the number of cycles |
@property (readonly) nsdictionary *settings |
Audio playback settings information, read-only |
@property (getter=ismeteringenabled) BOOL meteringenabled |
Whether audio measurement is enabled, default is no, once enabled audio measurement can be updated by the Updatemeters method |
Object methods |
Description |
-(Instancetype) Initwithcontentsofurl: (nsurl *) URL error: (Nserror *) outerror |
Use the file URL to initialize the player, note that this URL cannot be HTTP Url,avaudioplayer does not support loading network media streams, only local files can be played |
-(Instancetype) Initwithdata: (NSData *) Data error: (Nserror *) outerror |
Using NSData to initialize the player, note that the use of this method must be consistent with the file format and file suffix, otherwise error, so it is more recommended than this method or-(Instancetype) Initwithdata: (NSData *) data Filetypehint: (NSString *) utistring Error: (nserror * *) Outerror method initialization |
-(BOOL) Preparetoplay; |
Load the audio file into the buffer, note that this method will also be called implicitly even if the audio file is not loaded into the buffer program before playing. |
-(BOOL) play; |
Play audio files |
-(BOOL) Playattime: (nstimeinterval) time |
Start playing audio at a specified time |
-(void) pause; |
Pause Playback |
-(void) stop; |
Stop playing |
-(void) updatemeters |
Update audio measurements, note that if you want to update audio measurements, you must set meteringenabled to Yes, and you can get instant audio decibel information with audio measurements |
-(float) Peakpowerforchannel: (Nsuinteger) channelnumber; |
Gets the decibel peak of the specified channel, note that if you want to get a decibel spike, you must call the Updatemeters method before |
-(float) Averagepowerforchannel: (Nsuinteger) channelnumber |
Gets the decibel average of the specified channel, and note that if you want to obtain a decibel average, you must call the Updatemeters method |
@property (nonatomic, copy) Nsarray *channelassignments |
Get or set playback channels |
Proxy method |
Description |
-(void) audioplayerdidfinishplaying: (Avaudioplayer *) player successfully: (BOOL) flag |
Audio playback Complete |
-(void) Audioplayerdecodeerrordidoccur: (Avaudioplayer *) Player ERROR: (NSERROR *) error |
Audio decoding error occurred |
The following is a simple player using the Avaudioplayer implementation, in this player to play, pause, display playback progress function, of course, such as adjusting the volume, set the cycle mode, even the sound wave image (by analyzing the audio decibel value) and other functions can be achieved, here is no longer one by one demo. The interface effect is as follows:
- (void) viewdidload {[Super viewdidload]; //Do any additional setup after loading the view. }-(Ibaction) Stop: (ID) Sender {/** * Stops playback and undoes the setup needed for playback. */[_player stop]; //Specify the time that you play_player.currenttime =0;}-(Ibaction) Start: (ID) Sender {//Get MP3 PathNsurl *mp3url = [[NSBundle mainbundle] Urlforresource:@"Bbqne.mp3"Withextension:nil]; Staticdispatch_once_t Oncetoken; Dispatch_once (&oncetoken, ^{_player=[[Avaudioplayer alloc] Initwithcontentsofurl:mp3url Error:nil]; /** * A Boolean value, specifies whether playback rate adjustment are enabled for the audio player. */_player.enablerate=YES; /** * Prepares the audio player for playback by preloading it buffers. */[_player Preparetoplay]; //You can't add a global breakpoint here, or it will collapse. /** * The number of times a sound would return to the beginning, upon reaching the end, to repeat playback. */_player.numberofloops=maxfloat; _player.Delegate=Self ; _displaylink=[Cadisplaylink displaylinkwithtarget:self selector: @sel Ector (Playmusic)]; [_displaylink Addtorunloop:[nsrunloop Mainrunloop] formode:nsrunloopcommonmodes]; Avaudiosession*session =[Avaudiosession sharedinstance]; [[Nsnotificationcenter Defaultcenter] addobserver:self selector: @selector ( Handleinterruption:) name:avaudiosessioninterruptionnotification Object: Session]; _timeslider.maximumvalue=_player.duration; }); /** * Plays a sound asynchronously. */[_player play]; }/** * Change the progress bar*/- (void) Playmusic {_timeslider.value=_player.currenttime; intSEC =_timeslider.value; _timelabel.text= [NSString stringWithFormat:@"%02d", sec]; [_player Updatemeters]; DoubleLowpassresults = POW (Ten, (0.05* [Self.player Peakpowerforchannel:0])); floatresult =Ten* (float) Lowpassresults; NSLog (@"%.2f", result);}- (void) Handleinterruption: (Nsnotification *) Noti {//Handling Interrupt EventsNSLog (@"Handling Interrupt Events");}-(Ibaction) Pause: (ID) Sender {/** * pauses playback; sound remains ready to resume playback from where it is left off. */[_player pause];}/** * Specify the current playback time*/-(Ibaction) timechanged: (UISlider *) Sender {_player.currenttime=Sender.value;}/** * Change playback speed*/-(Ibaction) Ratechange: (UISlider *) Sender {_player.rate=Sender.value;}/** * Change the playback volume*/-(Ibaction) volunmchanged: (UISlider *) Sender {_player.volume=Sender.value;}
Recording
The Avfoundation framework also has a Avaudiorecorder class that specializes in recording operations, and it also supports multiple audio formats. Similar to Avaudioplayer, you can completely consider it as a tape recorder control class, the following are commonly used properties and methods:
@property (readonly, getter=isrecording) BOOL recording; |
Whether recording is being recorded, read-only |
@property (readonly) Nsurl *url |
Audio file address, read-only |
@property (readonly) nsdictionary *settings |
Recording file settings, read-only |
@property (readonly) Nstimeinterval currenttime |
Recording time is long, read only, note is only available in the recording state |
@property (readonly) Nstimeinterval Devicecurrenttime |
Enter the length of the setting, read-only, and note that this property is accessible all the time |
@property (getter=ismeteringenabled) BOOL meteringenabled; |
Whether to enable recording measurement, if you enable recording measurement can obtain data such as decibel recording |
@property (nonatomic, copy) Nsarray *channelassignments |
Channel for current recording |
Object methods |
Description |
-(Instancetype) Initwithurl: (nsurl *) URL settings: (nsdictionary *) settings error: (Nserror *) outerror |
Sound Recorder Object Initialization method, note that the URL must be local file url,settings is the recording format, encoding and other settings |
-(BOOL) Preparetorecord |
Prepare the recording, which is used primarily to create buffers, which are automatically called when the record is called, if not manually called |
-(BOOL) record |
Start recording |
-(BOOL) Recordattime: (nstimeinterval) time |
Start recording at a specified time, usually for recording pause and resume recording |
-(BOOL) Recordforduration: (nstimeinterval) duration |
Start recording as long as you specify |
-(BOOL) Recordattime: (nstimeinterval) Time forduration: (nstimeinterval) duration |
Start recording at a specified time and specify the length of the recording |
-(void) pause; |
Pause Recording |
-(void) stop; |
Stop Recording |
-(BOOL) deleterecording; |
Delete the recording, note that the recorder must be in a stopped state at this time |
-(void) updatemeters; |
Update the measurement data, note that only meteringenabled is yes this method is available |
-(float) Peakpowerforchannel: (Nsuinteger) channelnumber; |
Specify the measurement peaks of the channel, and note that only the updatemeters is called after the value |
-(float) Averagepowerforchannel: (Nsuinteger) channelnumber |
Specify the measured mean of the channel, and note that only the value is updatemeters after the call |
Proxy method |
Description |
-(void) audiorecorderdidfinishrecording: (Avaudiorecorder *) Recorder successfully: (BOOL) flag |
Finish recording |
-(void) Audiorecorderencodeerrordidoccur: (Avaudiorecorder *) Recorder error: (NSERROR *) error |
The construction of the program is mainly divided into the following steps:
- Set the audio session type to Avaudiosessioncategoryplayandrecord because the recording and playback operations are involved in the program.
- Create a Sound Recorder avaudiorecorder, specify the path to save the recording and set the recording properties, note that the sample rate and the number of bits required for a typical recording file are not high, and need to be set appropriately to ensure the size and effect of the recording file.
- Set up the Sound Recorder agent to play the recording after the recording is complete, and open the recording measurement to ensure real-time access to audio intensity. (Note the sound intensity range-160 to 0, 0 for maximum input)
- Create an audio player Avaudioplayer to play the recording after the recording is complete.
- Create a timer to refresh the recording measurements in real time and update the recording intensity to uiprogressview display.
- Add recording, pause, resume, stop operation, need to pay attention to the recording of the recovery operation is actually audio session management, restore as long as the record method can be called again, no need to manually manage the recovery time and so on.
Here's the main code
Audio playback and recording of iOS development