求大神解惑 关于录音格式准换问题

wan9396 2018-08-16 11:17:04

用AVAudioRecorder录音录出来的wav格式,后台那里需要amr格式的。 于是去找度娘。 找到了一个VoiceConvert的三方 里面用的 libopencore-amr 按照他的方法转换
- (NSString *)getFilePath {

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *urlPath = [path stringByAppendingPathComponent:@"123.wav"];

return urlPath;
}

- (NSString *)amrFilePath {

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *urlPath = [path stringByAppendingPathComponent:@"555.amr"];

return urlPath;
}
//转为amr
- (NSString *)audioWAVtoAMR {

NSString * wavFilePath = [self getFilePath];
NSString * amrFilePath = [self amrFilePath];
if ([EMVoiceConverter wavToAmr:wavFilePath amrSavePath:amrFilePath]) {

NSLog(@"成功了");

} else {

NSLog(@"wav转amr失败");
}


}
为啥转不成功 难道姿势哪里不对。。。。
设置的应该没问题
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];
//设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
//设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
[recordSetting setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];
//录音通道数 1 或 2
[recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
//线性采样位数 8、16、24、32
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
//录音的质量
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];


这是三方内部的部分代码

+ (int)wavToAmr:(NSString*)_wavPath amrSavePath:(NSString*)_savePath{

if (EM_EncodeWAVEFileToAMRFile([_wavPath cStringUsingEncoding:NSASCIIStringEncoding], [_savePath cStringUsingEncoding:NSASCIIStringEncoding], 1, 16))
return 0; // success

return 1; // failed
}

int EM_EncodeWAVEFileToAMRFile(const char* pchWAVEFilename, const char* pchAMRFileName, int nChannels, int nBitsPerSample)
{
FILE* fpwave;
FILE* fpamr;

/* input speech vector */
short speech[160];

/* counters */
int byte_counter, frames = 0;
size_t bytes = 0;

/* pointer to encoder state structure */
void *enstate;

/* requested mode */
enum Mode req_mode = MR122;
int dtx = 0;

/* bitstream filetype */
unsigned char amrFrame[MAX_AMR_FRAME_SIZE];

fpwave = fopen(pchWAVEFilename, "rb");
if (fpwave == NULL)
{
return 0;
}

// Initialize the amr file
fpamr = fopen(pchAMRFileName, "wb");
if (fpamr == NULL)
{
fclose(fpwave);
return 0;
}
/* write magic number to indicate single channel AMR file storage format */
bytes = fwrite(AMR_MAGIC_NUMBER, sizeof(char), strlen(AMR_MAGIC_NUMBER), fpamr);

/* skip to pcm audio data*/
SkipToPCMAudioData(fpwave);

enstate = Encoder_Interface_init(dtx);

while(1)
{
// read one pcm frame
if (!ReadPCMFrame(speech, fpwave, nChannels, nBitsPerSample)) break;

frames++;

/* call encoder */
byte_counter = Encoder_Interface_Encode(enstate, req_mode, speech, amrFrame, 0);

bytes += byte_counter;
fwrite(amrFrame, sizeof (unsigned char), byte_counter, fpamr );
}

Encoder_Interface_exit(enstate);

fclose(fpamr);
fclose(fpwave);

return frames;
}

好气啊。 求大神解决。
...全文
248 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wan9396 2018-08-17
  • 打赏
  • 举报
回复
楼上说得对 将pcm文件加上header转为wav格式后再去转换成amr 即可解决问题 谢谢楼上~~
aosept123 2018-08-16
  • 打赏
  • 举报
回复
这种问题是没法回答的,可能性太多,你首先要逐步定位具体都有是些地方失败了,然后才能收敛到有问题的地方。

如下步骤如下,
1.检查所有对象是否正确初始化,是否为空。
2.检查每个调用的返回值,是否正常.
3.所有检查点要打log。
4.一步一步用二分查找定位问题就行了,
最后,问问题也要把运行时的log也贴出来。
梦想不加班 2018-08-16
  • 打赏
  • 举报
回复
并且函数不能直接转,你要先分包,然后再调用三方函数去分别转每包的数据
梦想不加班 2018-08-16
  • 打赏
  • 举报
回复
补充一下:pcm包都可以存为wav格式,只需要加上50字节(好像是,具体的查一下,前段时间用了现在忘记了)的头就可以直接播放,所以原始的pcm包320bytes+wav包头 = wav每帧的包
梦想不加班 2018-08-16
  • 打赏
  • 举报
回复
首先你要查看pcm包有没有问题,pcm包应该是160short(320bytes),然后用Audacity软件(pcm播放软件)按照你设置的参数采集速率、通道数、采样位数等播放一下。如果确定pcm包没有问题了,在用三方软件去转。看你三方的代码大概猜测应该是转12K2速率16位采样的的pcm包的。
首先你要看转出来的amr包是多大的,然后对照以下链接去看下包头对不对,从而判断三方转换函数有没有问题,这部分你可以参考http://www.360doc.com/content/15/1201/21/12697_517252299.shtml,

29,049

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧