Может ли кто-нибудь помочь мне удалить первоначальную тишину в записанном аудио-файле?Удалить начальную тишину из записанного аудиофайла типа волны
Я извлекаю байты данных из wav-файла и после игнорирования первых 44 байтов заголовков, получающих конечный диапазон 0 байтов, которые молчат в волновом файле.
После этого из общих байт данных, конечного диапазона тихих звуковых байтов и общей продолжительности файла, я вычисляю время молчания аудиофайла и обрезаю это много времени из аудиофайла.
Но проблема в том, что в звуковом файле остается какая-то тихая часть.
Не уверен, что я что-то пропустил?
- (double)processAudio:(float)totalFileDuration withFilePathURL:(NSURL *)filePathURL{
NSMutableData *data = [NSMutableData dataWithContentsOfURL:filePathURL];
NSMutableData *Wave1= [NSMutableData dataWithData:[data subdataWithRange:NSMakeRange(44, [data length] - 44)]];
uint8_t * bytePtr = (uint8_t *)[Wave1 bytes] ;
NSInteger totalData = [Wave1 length]/sizeof(uint8_t);
int endRange = 0;
for (int i = 0 ; i < totalData; i ++){
/
if (bytePtr[i] == 0) {
endRange = i;
}else
break;
}
double silentAudioDuration =(((float)endRange/(float)totalData)*totalFileDuration);
return silentAudioDuration;
}
- (void)trimAudioFileWithInputFilePath :(NSString *)inputPath toOutputFilePath : (NSString *)outputPath{
/
NSString *strInputFilePath = inputPath;
NSURL *audioFileInput = [NSURL fileURLWithPath:strInputFilePath];
/
NSString *strOutputFilePath = [outputPath stringByDeletingPathExtension];
strOutputFilePath = [strOutputFilePath stringByAppendingString:@".m4a"];
NSURL *audioFileOutput = [NSURL fileURLWithPath:strOutputFilePath];
newPath = strOutputFilePath;
if (!audioFileInput || !audioFileOutput){
/
}
[[NSFileManager defaultManager] removeItemAtURL:audioFileOutput error:NULL];
AVAsset *asset = [AVAsset assetWithURL:audioFileInput];
CMTime audioDuration = asset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetAppleM4A];
if (exportSession == nil){
/
}
/
float startTrimTime = [self processAudio:audioDurationSeconds withFilePathURL:audioFileInput];
/
/
float endTrimTime = audioDurationSeconds;
recordingDuration = audioDurationSeconds - startTrimTime;
CMTime startTime = CMTimeMake((int)(floor(startTrimTime * 100)), 100);
CMTime stopTime = CMTimeMake((int)(ceil(endTrimTime * 100)), 100);
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime);
exportSession.outputURL = audioFileOutput;
exportSession.outputFileType = AVFileTypeAppleM4A;
exportSession.timeRange = exportTimeRange;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
if (AVAssetExportSessionStatusCompleted == exportSession.status){
}
else if (AVAssetExportSessionStatusFailed == exportSession.status){
}
}];
}
Что я здесь делаю неправильно?
Количество каналов 2 и бит на канал 16 ... поэтому я попытался с int16_t также, но не повезло. –