自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iPhone應(yīng)用開(kāi)發(fā)中關(guān)于PCM播放器源碼學(xué)習(xí)

移動(dòng)開(kāi)發(fā) iOS
本文介紹的是iPhone應(yīng)用開(kāi)發(fā)中關(guān)于PCM播放器源碼學(xué)習(xí),由于原始PCM文件不能容納任何關(guān)于其自身頻率或者幀大小之類的信息,本例將不得不對(duì)此自行設(shè)置,來(lái)看內(nèi)容詳解。

iPhone應(yīng)用開(kāi)發(fā)中關(guān)于PCM播放器源碼學(xué)習(xí)是本文要介紹的內(nèi)容,由于原始PCM文件不能容納任何關(guān)于其自身頻率或者幀大小之類的信息,本例將不得不對(duì)此自行設(shè)置。

我們會(huì)使用一種為經(jīng)過(guò)壓縮的PCM數(shù)據(jù)格式,具體參數(shù)喂16位、44KHz、單聲道。這些信息通過(guò)程序頂部的三個(gè)預(yù)定義值指定:

  1. #define BYTES_PER_SAMPLE 2 

16位等于兩個(gè)字節(jié)

  1. #define SAMPLE_PATE  44100 

每秒采樣率44100次等于44KHz

  1. typedef unsigned short sampleFrame;  
  2. 一個(gè)unsigned short 等于兩個(gè)字節(jié)(每個(gè)采樣)  
  3. #include <stdio.h> 
  4. #include <errno.h> 
  5. #include <sys/stat.h> 
  6. #include <AudioToolbox/AudioQueue.h> 
  7. #define BYTES_PER_SAMPLE 2  
  8. #define SAMPLE_PATE  44100  
  9. typedef unsigned short sampleFrame;  
  10. #define FRAME_COUNT 735  
  11. #define AUDIO_BUFFERS 3  
  12. typedef struct AQCallbackStruct{  
  13. AudioQueueRef queue;//播放隊(duì)列  
  14. UInt32 FrameCount;  
  15. AudioQueueBufferRef mBuffers[AUDIO_BUFFERS];  
  16. AudioStreamBasicDescription mDataFormat;  
  17. UInt32 sampleLen;  
  18. UInt32 playPtr;  
  19. sampleFrame *pcmBuffer;  
  20. }AQCallbackStruct;  
  21. void *loadpacm(const char *filename,unsigned long *len);  
  22. int playbuffer(void *pcm,unsigned long len);  
  23. void AQBufferCallback(void *in,AudioQueueRef inQ,AudioQueueBufferRef outQB);  
  24. int main(int argc,char *argv[])  
  25. {  
  26. char *filename;  
  27. unsigned long len;  
  28. void *pcmBuffer;  
  29. int ret;  
  30. if (argc<2)  
  31. {  
  32. fprintf(stderr, "Syntax: %s [filename]\n", argv[0]);  
  33. exit(EXIT_FAILURE);  
  34. }  
  35. filename = argv[1];  
  36. pcmBuffer = loadpacm(filename, &len);  
  37. if (!pcmBuffer)   
  38. {  
  39. fprintf(stderr, "%s: %s\n", filename, strerror(errno));  
  40. exit(EXIT_FAILURE);  
  41. }  
  42. ret = playbuffer(pcmBuffer,len);  
  43. free(pcmBuffer);  
  44. return ret;  
  45. }  
  46. void *loadpcm(const char *filename,unsigned long *len)  
  47. {  
  48. FILE  *file;  
  49. struct stat s;  
  50. void *pcm;  
  51. if (stat(filename,&s)) {  
  52. return NULL;  
  53. *len = s.st_size;  
  54. }  
  55. pcm = (void *) malloc(s.st_size);  
  56. if (!pcm) {  
  57. return NULL;  
  58. file = fopen(filename,"sb");  
  59. }  
  60. if(!file)  
  61. {  
  62. free(pcm);  
  63. return NULL;  
  64. }  
  65. fread(pcm,s.st_size,1,file);  
  66. fclose(file);  
  67. return pcm;  
  68. }  
  69. int playbuffer(void *pcmBuffer,unsigned long len)  
  70. {  
  71. AQCallbackStruct agc;  
  72. UInt32 err,bufferSize;  
  73. int i;  
  74. agc.mDataFormat.mSampleRate = SAMPLE_PATE;  
  75. agc.mDataFormat.mFormatID = kAudioFormatLinearPCM;  
  76. agc.mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;  
  77. agc.mDataFormat.mBytesPerPacket = 4;  
  78. agc.mDataFormat.mFramesPerPacket = 1;  
  79. agc.mDataFormat.mBytesPerFrame = 4;  
  80. agc.mDataFormat.mChannelsPerFrame = 2;  
  81. agc.mDataFormat.mBitsPerChannel = 16;  
  82. agc.FrameCount = FRAME_COUNT;  
  83. agc.sampleLen = len/BYTES_PER_SAMPLE;  
  84. agc.playPtr = 0;  
  85. agc.pcmBuffer = pcmBuffer;  
  86. err = AudioQueueNewOutput(&agc.mDataFormat,AQBufferCallback,&agc,NULL,  
  87.   kCFRunLoopCommonModes,0,&agc.queue);  
  88. if(err) return err;  
  89. agc.FrameCount = FRAME_COUNT;  
  90. bufferSize = agc.FrameCount * agc.mDataFormat.mBytesPerFrame;  
  91. for (i=0; i<AUDIO_BUFFERS; i++)  
  92. {  
  93. err = AudioQueueAllocateBuffer(agc.queue,bufferSize,&agc.mBuffers[i]);  
  94. if(err) return err;  
  95. AQBufferCallback(&agc,agc.queue,agc.mBuffers[i]);  
  96. }  
  97. err = AudioQueueStart(agc.queue,NULL);  
  98. if(err) return err;  
  99. while (agc.playPtr<agc.sampleLen)  
  100. {  
  101. select(NULL,NULL,NULL,NULL,1.0);  
  102. }  
  103. sleep(1);  
  104. return 0;  
  105. }  
  106. void AQBufferCallback( void *in, AudioQueueRef inQ, AudioQueueBufferRef outQB)  
  107. {  
  108. AQCallbackStruct *agc;  
  109. short *coreAudiobuffer;  
  110. short sample;  
  111. int i;  
  112. agc=(AQCallbackStruct *) in;  
  113. coreAudiobuffer =(short*) outQB->mAudioData;  
  114. printf("Sync:%i / %i \n",agc->playPtr,agc->sampleLen);  
  115. if (agc->FrameCount >0)   
  116. {  
  117. outQB->mAudioDataByteSize = 4*agc->FrameCount;  
  118. for (i=0; i<agc->FrameCount*2; i++)   
  119. {  
  120. if(agc->playPtr > agc->sampleLen || agc->playPtr<0)  
  121. {  
  122. sample =0;  
  123. }  
  124. else  
  125. {  
  126. sample = (agc->pcmBuffer[agc->playPtr]);  
  127. }  
  128. coreAudiobuffer[i] = sample;  
  129. coreAudiobuffer[i+1] = sample;  
  130. agc->playPtr++;  
  131. }  
  132. AudioQueueEnqueueBuffer(inQ,outQB,0,NULL);  

}如果你無(wú)法找到一個(gè)原始的PCM元數(shù)據(jù),你可以用.wav格式文件代替,制藥以16位44KHz原始PCM編碼的就行。

編譯命令:

  1. $ gcc -o playpcm playpcm.c \  
  2. -framework AudioToolbox -framework CoreAudio -framework CoreFoundation 

小結(jié):iPhone應(yīng)用開(kāi)發(fā)中關(guān)于PCM播放器源碼學(xué)習(xí)的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-08-09 17:12:30

iPhoneCFRunLoop

2011-08-18 10:39:46

iPhone開(kāi)發(fā)界面

2011-07-20 16:21:20

iPhone 視頻 播放器

2014-12-31 16:52:53

音樂(lè)播放器源碼

2011-08-15 13:44:07

iPhone開(kāi)發(fā)UITableView

2011-08-08 14:07:49

iPhone開(kāi)發(fā) 字體

2011-08-08 18:19:09

iPhone音頻播放

2011-08-12 09:48:24

iPhoneCoreLocatio定位

2011-08-08 10:10:14

iPhone開(kāi)發(fā) 圖片 方法

2011-08-09 17:29:29

iPhone文件屏幕

2011-08-19 10:35:19

iPhone應(yīng)用Three20

2011-06-13 09:33:04

2022-08-16 17:37:06

視頻播放器鴻蒙

2015-01-22 15:44:55

Android源碼音樂(lè)播放器

2015-09-01 16:48:44

ios暴風(fēng)視頻播放器

2011-08-08 14:57:46

iPhone Autoreleas Property

2011-08-05 14:48:06

iPhone應(yīng)用 異步隊(duì)列

2023-03-28 09:38:34

開(kāi)發(fā)應(yīng)用鴻蒙

2023-03-28 09:44:02

開(kāi)發(fā)應(yīng)用鴻蒙

2023-03-29 09:37:49

視頻播放器應(yīng)用鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)