目标c中的音频文件格式问题(Audio file format issue in objective c)
我用AVAudioRecorder写了一个音频WAV(录制了我的声音)文件。 最终的文件格式是WAV文件。 文件已成功保存,我可以听到我的声音。 我想将此文件发送到后端服务器(Web服务)。 但我的服务器只接受WAV中的数据和FMT信息。 它不接受我的wav文件,因为我使用FLLR,数据,FMT进行了wav文件信息。 我在Riffpad工具中检查了我的WAV文件信息。 它显示FLLR,数据,FMT。 但我只想要数据和fmt。 因为我的服务器端只接受数据和FMT。 所以请建议如何以编程方式删除我的wav文件中的FLLR?
我的记录源代码:
NSError *error; // Recording settings NSMutableDictionary *settings = [NSMutableDictionary dictionary]; [settings setValue: [NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [settings setValue: [NSNumber numberWithFloat:22050] forKey:AVSampleRateKey]; [settings setValue: [NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; // mono [settings setValue: [NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; //[settings setValue: [NSNumber numberWithInt:16] forKey:AudioSampleType]; // File URL NSURL *url = [NSURL fileURLWithPath:FILEPATH]; //NSLog(@"Url file path ::: %@",url); // Create recorder recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; if (!recorder) { // NSLog(@"Error establishing recorder: %@", error.localizedFailureReason); return; }
I have written an audio WAV (have recorded my voice) file using AVAudioRecorder. The final file format is a WAV file. File was successfully saved and I can hear my voice. I want to send this file to a back End server (web-service). But my server accepting only data and FMT information in WAV . It is not accepting my wav file because of my wav file infromation with FLLR, data, FMT. I have checked my WAV file information in Riffpad tool. It's showing FLLR, data, FMT. But I want only data and fmt. Because my server side accepts only data and FMT. So please advice how to remove FLLR in my wav file in programmatically?
My source code for the record:
NSError *error; // Recording settings NSMutableDictionary *settings = [NSMutableDictionary dictionary]; [settings setValue: [NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [settings setValue: [NSNumber numberWithFloat:22050] forKey:AVSampleRateKey]; [settings setValue: [NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; // mono [settings setValue: [NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; //[settings setValue: [NSNumber numberWithInt:16] forKey:AudioSampleType]; // File URL NSURL *url = [NSURL fileURLWithPath:FILEPATH]; //NSLog(@"Url file path ::: %@",url); // Create recorder recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; if (!recorder) { // NSLog(@"Error establishing recorder: %@", error.localizedFailureReason); return; }
原文:https://stackoverflow.com/questions/32312508
最满意答案
感谢上帝和你的支持朋友。 是的,我终于解决了我的问题。 我不知道方式是正确的。 但我的问题解决了。 我使用上面的代码录制了声音并保存了我的音频。然后再次使用以下代码导出音频。 我从https://developer.ibm.com/answers/questions/180732/seems-watson-text-to-speech-service-returns-a-wav.html获取了此代码
-(NSData*) stripAndAddWavHeader:(NSData*) wav { unsigned long wavDataSize = [wav length] - 44; NSData *WaveFile= [NSMutableData dataWithData:[wav subdataWithRange:NSMakeRange(44, wavDataSize)]]; NSMutableData *newWavData; newWavData = [self addWavHeader:WaveFile]; return newWavData; } - (NSMutableData *)addWavHeader:(NSData *)wavNoheader { int headerSize = 44; long totalAudioLen = [wavNoheader length]; long totalDataLen = [wavNoheader length] + headerSize-8; long longSampleRate = 22050.0; int channels = 1; long byteRate = 8 * 44100.0 * channels/8; Byte *header = (Byte*)malloc(44); header[0] = 'R'; // RIFF/WAVE header header[1] = 'I'; header[2] = 'F'; header[3] = 'F'; header[4] = (Byte) (totalDataLen & 0xff); header[5] = (Byte) ((totalDataLen >> 8) & 0xff); header[6] = (Byte) ((totalDataLen >> 16) & 0xff); header[7] = (Byte) ((totalDataLen >> 24) & 0xff); header[8] = 'W'; header[9] = 'A'; header[10] = 'V'; header[11] = 'E'; header[12] = 'f'; // 'fmt ' chunk header[13] = 'm'; header[14] = 't'; header[15] = ' '; header[16] = 16; // 4 bytes: size of 'fmt ' chunk header[17] = 0; header[18] = 0; header[19] = 0; header[20] = 1; // format = 1 header[21] = 0; header[22] = (Byte) channels; header[23] = 0; header[24] = (Byte) (longSampleRate & 0xff); header[25] = (Byte) ((longSampleRate >> 8) & 0xff); header[26] = (Byte) ((longSampleRate >> 16) & 0xff); header[27] = (Byte) ((longSampleRate >> 24) & 0xff); header[28] = (Byte) (byteRate & 0xff); header[29] = (Byte) ((byteRate >> 8) & 0xff); header[30] = (Byte) ((byteRate >> 16) & 0xff); header[31] = (Byte) ((byteRate >> 24) & 0xff); header[32] = (Byte) (2 * 8 / 8); // block align header[33] = 0; header[34] = 16; // bits per sample header[35] = 0; header[36] = 'd'; header[37] = 'a'; header[38] = 't'; header[39] = 'a'; header[40] = (Byte) (totalAudioLen & 0xff); header[41] = (Byte) ((totalAudioLen >> 8) & 0xff); header[42] = (Byte) ((totalAudioLen >> 16) & 0xff); header[43] = (Byte) ((totalAudioLen >> 24) & 0xff); NSMutableData *newWavData = [NSMutableData dataWithBytes:header length:44]; [newWavData appendBytes:[wavNoheader bytes] length:[wavNoheader length]]; return newWavData; }
Thank God and your support friends. Yes finally i solved my issues. I don't know the way is correct. But my issues is solved. I recorded voice using above code and save my audio .Then again i will export the audio using the following code. I got this code from https://developer.ibm.com/answers/questions/180732/seems-watson-text-to-speech-service-returns-a-wav.html
-(NSData*) stripAndAddWavHeader:(NSData*) wav { unsigned long wavDataSize = [wav length] - 44; NSData *WaveFile= [NSMutableData dataWithData:[wav subdataWithRange:NSMakeRange(44, wavDataSize)]]; NSMutableData *newWavData; newWavData = [self addWavHeader:WaveFile]; return newWavData; } - (NSMutableData *)addWavHeader:(NSData *)wavNoheader { int headerSize = 44; long totalAudioLen = [wavNoheader length]; long totalDataLen = [wavNoheader length] + headerSize-8; long longSampleRate = 22050.0; int channels = 1; long byteRate = 8 * 44100.0 * channels/8; Byte *header = (Byte*)malloc(44); header[0] = 'R'; // RIFF/WAVE header header[1] = 'I'; header[2] = 'F'; header[3] = 'F'; header[4] = (Byte) (totalDataLen & 0xff); header[5] = (Byte) ((totalDataLen >> 8) & 0xff); header[6] = (Byte) ((totalDataLen >> 16) & 0xff); header[7] = (Byte) ((totalDataLen >> 24) & 0xff); header[8] = 'W'; header[9] = 'A'; header[10] = 'V'; header[11] = 'E'; header[12] = 'f'; // 'fmt ' chunk header[13] = 'm'; header[14] = 't'; header[15] = ' '; header[16] = 16; // 4 bytes: size of 'fmt ' chunk header[17] = 0; header[18] = 0; header[19] = 0; header[20] = 1; // format = 1 header[21] = 0; header[22] = (Byte) channels; header[23] = 0; header[24] = (Byte) (longSampleRate & 0xff); header[25] = (Byte) ((longSampleRate >> 8) & 0xff); header[26] = (Byte) ((longSampleRate >> 16) & 0xff); header[27] = (Byte) ((longSampleRate >> 24) & 0xff); header[28] = (Byte) (byteRate & 0xff); header[29] = (Byte) ((byteRate >> 8) & 0xff); header[30] = (Byte) ((byteRate >> 16) & 0xff); header[31] = (Byte) ((byteRate >> 24) & 0xff); header[32] = (Byte) (2 * 8 / 8); // block align header[33] = 0; header[34] = 16; // bits per sample header[35] = 0; header[36] = 'd'; header[37] = 'a'; header[38] = 't'; header[39] = 'a'; header[40] = (Byte) (totalAudioLen & 0xff); header[41] = (Byte) ((totalAudioLen >> 8) & 0xff); header[42] = (Byte) ((totalAudioLen >> 16) & 0xff); header[43] = (Byte) ((totalAudioLen >> 24) & 0xff); NSMutableData *newWavData = [NSMutableData dataWithBytes:header length:44]; [newWavData appendBytes:[wavNoheader bytes] length:[wavNoheader length]]; return newWavData; }
相关问答
更多-
假设您拥有的URI是注册处理程序,您可以使用: UIApplication.OpenUrl UIKit.UIApplication.OpenUrl方法打开指定的URL,启动已注册处理该方案的应用程序。 还有铆钉 (App链接的C#端口)也可以使用。 Assuming the URI you have is a registered handler, you can just use: UIApplication.OpenUrl UIKit.UIApplication.OpenUrl Method ...
-
AVAsset *asset = [AVAsset assetWithURL:
]; BOOL hasVideo = [asset tracksWithMediaType:AVMediaTypeVideo].count > 0; BOOL hasAudio = [asset tracksWithMediaType:AVMediaTypeAudio].count > 0; AVAsset *asset = [AVAsset assetWithURL: ]; BOO ... -
假设您已将资源直接放在正确的本地化文件夹中,您应该能够将此用作路径: NSString* resourcePath = [[NSBundle mainBundle] pathForResource:@"localize-test" ofType:@"wav"]; You should be able to use just this for your path, assuming you've ...
-
AudioStreamBasicDescription: 0 ch,0 Hz,'lpcm' (0x0000000E) 16-bit signed integer 一个问题是你没有指定通道数(见0 ch )。 所以你需要指定它。 你应该看到类似的东西: AudioStreamBasicDescription: 1 ch, 44100 Hz, 'lpcm' (0x0000000E) 16-bit signed integer AudioStreamBasicDescription: 0 ch,0 Hz,'l ...
-
我试图播放音频文件,它不工作目标C IOS(I am trying to play an audio file and it doesnt work Objective C IOS)[2022-02-18]
尝试为玩家创建类属性: @property (nonatomic, strong) AVAudioPlayer *player; 然后用它来播放声音。 否则,您的播放器将在创建完成后的方法之后立即释放。 Try creating class attribute for a player: @property (nonatomic, strong) AVAudioPlayer *player; And then use it to play sound. Otherwise, your player wi ... -
您需要一个Objective-C类和一些方法来包装C ++函数调用。 @interface WrapperClass : NSObject -(void) display; @end void display() { .... .... } @implementation WrapperClass -(void) display { display(); } @end static WrapperClass* wrapperObj = nil; void doSomthing() { ...
-
未压缩的WAV是音频编辑的事实标准。 您可以使用各种库轻松操纵它们。 如果你只是想要没有WAV头部的完全原始样本,那么你需要提前知道你的采样率,频率等,因为你不会拥有那些通常在WAV头部中的信息是未压缩的样本。 Uncompressed WAV is the defacto standard for audio editing. You can use various libraries to manipulate them easily. If you simply want completely raw ...
-
感谢上帝和你的支持朋友。 是的,我终于解决了我的问题。 我不知道方式是正确的。 但我的问题解决了。 我使用上面的代码录制了声音并保存了我的音频。然后再次使用以下代码导出音频。 我从https://developer.ibm.com/answers/questions/180732/seems-watson-text-to-speech-service-returns-a-wav.html获取了此代码 -(NSData*) stripAndAddWavHeader:(NSData*) wav { un ...
-
最有可能的问题是这一行: NSData *file1Data = [[NSData alloc] initWithContentsOfFile:[recorder.url absoluteString]]; initWithContentsOfFile:方法需要一个文件路径,但是您传入的是表示文件URL的字符串。 尝试这个: NSData *file1Data = [[NSData alloc] initWithContentsOfFile:[recorder.url path]]; 要么: NSDat ...
-
没有直接的方法来在音频文件上实现这样的功能。 我建议这样做是为了创建音频文件的大块,并在一个音频文件中以相反的顺序合并它们。 您可以使用AVMutableComposition , AVMutableCompositionTrack , AVAssetExportSession API来实现此目的。 您还可以通过修剪 Apple文档中提到的电影文件获得更多帮助,您也可以为音频文件执行相同操作。 There is no direct way to achieve such feature on audio f ...