大佬教程收集整理的这篇文章主要介绍了ios – 反转音频文件Swift / Objective-C,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
更新:
在another post我发现AVAssetReader可用于从音频文件中读取音频样本,但我不知道如何以相反的顺序写回样本.以下代码片段直接来自帖子.任何帮助,将不胜感激.谢谢
+ (void) reverseAudioTrack: (AVAsset *)audioAsset outputURL: (NSURL *)outputURL { NSError *error; AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:audioAsset error:&error]; if (error) {NSLog(@"%@",error.localizedDescription);} AVAssetTrack* track = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectATindex:0]; NSMutableDictionary* audioReadSetTings = [NSMutableDictionary Dictionary]; [audioReadSetTings SETVALue:[NSnumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; AVAssetReaderTrackOutput* readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSetTings:audioReadSetTings]; [reader addOutput:readerOutput]; [reader startReading]; CMSampleBufferRef sample; //= [readerOutput copyNextSampleBuffer]; NSMutableArray *samples = [[NSMutableArray alloc] init]; // Get all samples while((sample = [readerOutput copyNextSampleBuffer])) { [samples addObject:(__bridge id)sample]; CFRelease(samplE); } // Process samples in reverse AudioChAnnelLayout acl; bzero(&acl,sizeof(acl)); acl.mChAnnelLayoutTag = kAudioChAnnelLayoutTag_Stereo; AVAssetWriter *writer = [[AVAssetWriter alloc] initWithURL:outputURL fileType:AVFileTypeAppleM4A error:&error]; if (error) {NSLog(@"%@",error.localizedDescription);} NSDictionary *writerOutputSetTings = [ NSDictionary DictionaryWithObjectsAndKeys: [ NSnumber numberWithInt: kAudioFormatAppleLossless ],AVFormatIDKey,[ NSnumber numberWithInt: 16 ],AVEncoderBitDepthHintKey,[ NSnumber numberWithFloat: 44100.0 ],AVSampleRateKey,[ NSnumber numberWithInt: 1 ],AVnumberOfChAnnelsKey,[ NSData dataWithBytes: &acl length: sizeof( acl ) ],AVChAnnelLayoutKey,nil ]; AVAssetWriterInput *audioWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSetTings:writerOutputSetTings]; [writer addInput:audioWriterInput]; [writer startWriTing]; [writer startSessionAtsourceTime:CMSampleBufferGetPresentationtimestamp((__bridge CMSampleBufferRef)samples[0]) ]; // (1) Would it work if I loop in reverse here? for (NSInteger i = 0; i < samples.count; i++) { CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer((__bridge CMSampleBufferRef)samples[i]); CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples((__bridge CMSampleBufferRef)samples[i]); AudioBufferList audioBufferList; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer((__bridge CMSampleBufferRef)samples[i],NULL,&audioBufferList,sizeof(audioBufferList),kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,&buffer ); for (int bufferCount = 0; bufferCount < audioBufferList.mnumberBuffers; bufferCount++) { SInt16* samples = (SInt16 *)audioBufferList.mBuffers[bufferCount].mData; for (int i=0; i < numSamplesInBuffer; i++) { // amplitude for the sample is samples[i],assuming you have linear pcm to start with // (2) what should I be doing to write the samples into an audio file? } } CFRelease(buffer); }
但是,大多数这些格式(mp3命名为1)都是有损和压缩的.您必须首先解压缩数据,应用转换并重新压缩.您将应用于音频信息的大多数转换应该可以在原始PCM级别完成.
结合这两个语句,您可以在几个过程中执行此操作:
>将原始文件转换为符合kAudioFormatLinearPCM的音频文件,如AIFF
>处理该临时文件(反转其内容)
>将临时文件转换回原始格式
就像你将一个转换应用于压缩的jpeg图像一样,这个过程也会有所退化.最后的音频最多只会遭受一次压缩循环.
所以这种方法真正的数学答案实际上是没有的.
仅供参考,这里是swift 3中的一些入门代码.需要进一步细化才能跳过文件头.
var outAudioFile:AudioFilEID? var pcm = AudioStreamBasicDescription(mSampleRate: 44100.0,mFormatID: kAudioFormatLinearPCM,mFormatFlags: kAudioFormatFlagIsBigendian | kAudioFormatFlagIsSignedInteger,mBytesPerPacket: 2,mFramesPerPacket: 1,mBytesPerFrame: 2,mChAnnelsPerFrame: 1,mBitsPerChAnnel: 16,mReserved: 0) var theErr = AudioFileCreateWithURL(desturl as CFURL!,kAudioFileAIFFType,&pcm,.eraseFile,&outAudioFilE) if noErr == theErr,let outAudioFile = outAudioFile { var inAudioFile:AudioFilEID? theErr = AudioFiLeopenURL(sourceUrl as! CFURL,.readPermission,&inAudioFilE) if noErr == theErr,let inAudioFile = inAudioFile { var fileDataSize:UInt64 = 0 var thePropertySize:UInt32 = UInt32(MemoryLayout<UInt64>.StridE) theErr = AudioFileGetProperty(inAudioFile,kAudioFilePropertyAudioDataByteCount,&thePropertySize,&fileDataSizE) if( noErr == theErr) { let dataSize:Int64 = Int64(fileDataSizE) let theData = UnsafeMutableRawPointer.allocate(bytes: Int(dataSizE),alignedTo: MemoryLayout<UInt8>.alignment) var readPoint:Int64 = Int64(dataSizE) var writePoint:Int64 = 0 while( readPoint > 0 ) { var bytesToRead = UInt32(2) AudioFileReadBytes( inAudioFile,false,readPoint,&bytesToRead,theData) AudioFileWriteBytes( outAudioFile,writePoint,theData) writePoint += 2 readPoint -= 2 } theData.deallocate(bytes: Int(dataSizE),alignedTo: MemoryLayout<UInt8>.alignment) AudioFileClose(inAudioFilE); AudioFileClose(outAudioFilE); } } }
以上是大佬教程为你收集整理的ios – 反转音频文件Swift / Objective-C全部内容,希望文章能够帮你解决ios – 反转音频文件Swift / Objective-C所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。