日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PCM转MP3工具的封装

發(fā)布時(shí)間:2025/7/25 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PCM转MP3工具的封装 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PCM轉(zhuǎn)MP3工具的封裝

?

說(shuō)明

1. 對(duì) PCM 轉(zhuǎn) MP3 進(jìn)行了簡(jiǎn)單的封裝.

2. 使用?https://github.com/wuqiong/mp3lame-for-iOS 生成支持64位的 lame 庫(kù).

?

源碼

https://github.com/YouXianMing/iOS-General-Tools 中的?PCM-to-MP3

// // PcmToMp3Manager.h // RecordMusic // // Created by YouXianMing on 16/7/28. // Copyright ? 2016年 YouXianMing. All rights reserved. // // Lame-for-iOS https://github.com/wuqiong/mp3lame-for-iOS // #import <Foundation/Foundation.h> @class PcmToMp3Manager;@protocol PcmToMp3ManagerDelegate <NSObject>@optional/*** Did convert the pcm to mp3.** @param manager The PcmToMp3Manager object.* @param sucess Sucess or not.* @param errorInfo Error info.*/ - (void)didConvertPcmToMp3:(PcmToMp3Manager *)manager sucess:(BOOL)sucess errorInfo:(NSString *)errorInfo;@end/*** In "Build Phases", You can add '-Wno-shorten-64-to-32' to the file 'PcmToMp3Manager.m' to ignore the warning.*/ @interface PcmToMp3Manager : NSObject/*** The PcmToMp3Manager's delegate.*/ @property (nonatomic, weak) id <PcmToMp3ManagerDelegate> delegate;/*** The pcm file's path.*/ @property (nonatomic, strong) NSString *pcmFilePath;/*** The mp3 file's path you specified.*/ @property (nonatomic, strong) NSString *mp3FilePath;/*** Before you start convert, you should specified the pcm file's path.*/ - (void)startConvert;@end // // PcmToMp3Manager.m // RecordMusic // // Created by YouXianMing on 16/7/28. // Copyright ? 2016年 YouXianMing. All rights reserved. // #import "PcmToMp3Manager.h" #import <lame/lame.h>@implementation PcmToMp3Manager- (void)startConvert {NSParameterAssert(self.pcmFilePath);BOOL isDirectory = NO;BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:self.pcmFilePath isDirectory:&isDirectory];if (isExist && isDirectory == NO) {dispatch_async(dispatch_get_global_queue(0, 0), ^{@try {int read, write;FILE *pcm = fopen([self.pcmFilePath cStringUsingEncoding:1], "rb"); //sourcefseek(pcm, 4*1024, SEEK_CUR); //skip file headerFILE *mp3 = fopen([self.mp3FilePath cStringUsingEncoding:1], "wb"); //outputconst int PCM_SIZE = 8192;const int MP3_SIZE = 8192;short int pcm_buffer[PCM_SIZE * 2];unsigned char mp3_buffer[MP3_SIZE];lame_t lame = lame_init();lame_set_in_samplerate(lame, 44100);lame_set_VBR(lame, vbr_default);lame_init_params(lame);do {read = fread(pcm_buffer, 2 * sizeof(short int), PCM_SIZE, pcm);if (read == 0) {write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);} else {write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);}fwrite(mp3_buffer, write, 1, mp3);} while (read != 0);lame_close(lame);fclose(mp3);fclose(pcm);} @catch (NSException *exception) {if (self.delegate && [self.delegate respondsToSelector:@selector(didConvertPcmToMp3:sucess:errorInfo:)]) {dispatch_async(dispatch_get_main_queue(), ^{[self.delegate didConvertPcmToMp3:self sucess:NO errorInfo:exception.description];});}} @finally {if (self.delegate && [self.delegate respondsToSelector:@selector(didConvertPcmToMp3:sucess:errorInfo:)]) {dispatch_async(dispatch_get_main_queue(), ^{[self.delegate didConvertPcmToMp3:self sucess:YES errorInfo:nil];});}}});} else {if (self.delegate && [self.delegate respondsToSelector:@selector(didConvertPcmToMp3:sucess:errorInfo:)]) {dispatch_async(dispatch_get_main_queue(), ^{[self.delegate didConvertPcmToMp3:self sucess:NO errorInfo:[NSString stringWithFormat:@"'%@' not exist.", self.pcmFilePath]];});}} }@end

?

細(xì)節(jié)

為了去除 PcmToMp3Manager 的?warning, 在文件?PcmToMp3Manager.m?添加?-Wno-shorten-64-to-32 即可

?

轉(zhuǎn)載于:https://www.cnblogs.com/YouXianMing/p/5714914.html

總結(jié)

以上是生活随笔為你收集整理的PCM转MP3工具的封装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。