成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

我們會(huì)使用一種為經(jīng)過壓縮的PCM數(shù)據(jù)格式,具體參數(shù)喂16位、44KHz、單聲道。這些信息通過程序頂部的三個(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);  

}如果你無法找到一個(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)用開發(fā)中關(guān)于PCM播放器源碼學(xué)習(xí)的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!

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

2011-08-09 17:12:30

iPhoneCFRunLoop

2011-08-18 10:39:46

iPhone開發(fā)界面

2011-07-20 16:21:20

iPhone 視頻 播放器

2011-08-15 13:44:07

iPhone開發(fā)UITableView

2014-12-31 16:52:53

音樂播放器源碼

2011-08-08 14:07:49

iPhone開發(fā) 字體

2011-08-08 18:19:09

iPhone音頻播放

2011-08-08 10:10:14

iPhone開發(fā) 圖片 方法

2011-08-09 17:29:29

iPhone文件屏幕

2011-08-12 09:48:24

iPhoneCoreLocatio定位

2011-08-19 10:35:19

iPhone應(yīng)用Three20

2011-08-08 14:57:46

iPhone Autoreleas Property

2011-08-05 14:48:06

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

2015-09-01 16:48:44

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

2015-01-22 15:44:55

Android源碼音樂播放器

2011-06-13 09:33:04

2022-08-16 17:37:06

視頻播放器鴻蒙

2011-07-29 13:27:48

iPhone 開發(fā) Nib

2011-08-10 17:37:00

iPhoneASIHTTPRequ

2023-03-28 09:44:02

開發(fā)應(yīng)用鴻蒙
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久久女女女女999久久 | 久草热在线| 91久久精品国产免费一区 | 一区中文字幕 | 国产日韩欧美在线一区 | 99成人| 一区在线视频 | 中文字幕在线观看国产 | 亚洲精品一区二区三区四区高清 | 一区二区三区高清在线观看 | 亚洲一区二区三区在线观看免费 | 先锋资源网站 | 一级电影免费看 | 理论片免费在线观看 | 成年人网站免费视频 | 麻豆精品一区二区三区在线观看 | 国产精品精品视频一区二区三区 | 日本黄色短片 | 精品国产欧美一区二区三区成人 | 日韩欧美在线观看视频 | 国产亚洲一级 | 99re6在线 | 欧美日韩一区二区在线播放 | 欧美日韩成人影院 | 自拍偷拍小视频 | 中文字幕精品一区二区三区精品 | 91精品导航 | 欧美午夜影院 | 久热中文字幕 | 中文字幕精品一区二区三区在线 | 亚洲天堂一区二区 | 中文字幕国产精品 | 精精国产xxxx视频在线播放 | 亚洲一区二区三区视频在线 | 美女国内精品自产拍在线播放 | 精品国产一区二区三区久久久久久 | 成人免费在线观看视频 | 日韩www| 天天爽天天操 | 亚洲一区二区精品视频 | 日本在线观看视频 |