[
-(id
)initsession
void interruptionlistenercallback (
void
*inuserdata, uint32 interruptionstate)
else
if(interruptionstate == kaudiosessionendinterruption )
[ad resume];
}}
error = audiofilestreamopen(
(void
*)self,
&audiofilestreampropertylistenerproc, //監聽設定變化
&audiofilestreampacketsproc, //資料解析後的接收函式
0,
&audio_file_stream);//**流的id
void audiofilestreampropertylistenerproc(
void
*inclientdata,
audiofilestreamid inaudiofilestream,
audiofilestreampropertyid inpropertyid,
uint32 *ioflags)
void audiofilestreampacketsproc(
void
*inclientdata,
uint32 innumberbytes,
uint32 innumberpackets,
const
void
*ininputdata,
audiostreampacketdescription *inpacketdescriptions)
然後再把nsdata傳給解碼器解析:
error = audiofilestreamparsebytes(
audio_file_stream,//在這時,**流檔案id被生成
datalen,
[data bytes],
kaudiofilestreamproperty_fileformat);
這樣解碼後的資料自動會被傳送到audiofilestreampacketsproc介面裡。。
第三步;準備buffer資料(maudiodata(所有的data),maudiodatabytesize資料的大小,num_packets多少包,packet_descriptions包的描述)
-(id
)initwithdata:
(nsdata
*)_data packets:
(uint32)_num_packets packetdescriptions:
(const audiostreampacketdescription*
)_packet_descriptions
uint32 formatlistsize;
boolean b;//拿**流檔案id申請它的**格式結構資訊
audiofilestreamgetpropertyinfo(audio_file_stream,
kaudiofilestreamproperty_formatlist,
&formatlistsize,
&b);
// now get the format data得到**格式資訊
nsmutabledata
*listdata =
[nsmutabledata datawithlength:formatlistsize];
osstatus status = audiofilestreamgetproperty(audio_file_stream,
kaudiofilestreamproperty_formatlist,
&formatlistsize,
[listdata mutablebytes]
); audioformatlistitem *formatlist =
[listdata mutablebytes];
// the formatlist property isn't always supported, so an error isn't unexpected here.
// therefore, we won't call verify_status on this status code.
if(status == noerr)
else
}else}
float32 outvalue ;
audioqueuegetparameter(audio_queue,kaudioqueuedeviceproperty_numberchannels,&outvalue) ;
if(!
[self createaudioqueue])}
-(bool
)createaudioqueue
[buffer enqueueonqueue:audio_queue]; -
(void
)enqueueonqueue:
(audioqueueref)queue
buffer->maudiodatabytesize =
[data length];
memcpy((
char
*)buffer->maudiodata, [data bytes], [data length]
); error = audioqueueenqueuebuffer(queue, buffer, num_packets, packet_descriptions);
if(error)
}
音訊的總結
音訊編解碼器 codec 錄音 麥克風 模擬訊號 數碼訊號 1.對pcm等訊號進行d a轉換,把數字的音訊訊號轉換為模擬訊號 2.對mic linein或者其他輸入源的模擬訊號進行a d轉換,把模擬的聲音頻號轉變cpu能夠處理的數碼訊號 4.對音訊訊號做出相應的處理,例如音量控制,功率放大,eq控制...
webrtc音訊引擎總結
該篇文章將基於voice engine模組對webrt音訊做個總結,但是不包括網路傳輸部分的細節介紹。關於webrtc的網路模組,將會在接下來的時間以單獨的網路模組介紹與大家分享。voice engine 引擎模組的 結構 include資料夾下的所有.h檔案,都是在呼叫webrtc音訊引擎的時候必...
音訊變調演算法總結
一段聲音可以理解為多種頻率正弦波的疊加 1 而音調就是一段聲音的主要頻率。改變了主要頻率,就是改變了音調 提高了主要頻率,就是公升調,反之亦然。同步交疊相加方法 synchronized overlap add method,sola 是一種常見的時域法。在 sox 中的 pitch 音效使用的就是...