• iOS-音频格式转换-b


    iOS处理音频过程中有时候需要不同格式的音频进行转换,最近需要将m4a格式的音频转换成wav,在网上搜索之后代码整理如下:

    - (void)convetM4aToWav:(NSURL *)originalUrl  destUrl:(NSURL *)destUrl {    
        AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:originalUrl options:nil];    //读取原始文件信息     
        NSError *error = nil;    
        AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:songAsset error:&error];    
        if (error) {        
            NSLog (@"error: %@", error);        
            return;     
        }    
        AVAssetReaderOutput *assetReaderOutput = [AVAssetReaderAudioMixOutput                                                assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks                                                audioSettings: nil];    
        if (![assetReader canAddOutput:assetReaderOutput]) {        
            NSLog (@"can't add reader output... die!");        
            return;     
        }     
        [assetReader addOutput:assetReaderOutput];    
    
        AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:destUrl                                                            fileType:AVFileTypeCoreAudioFormat                                                               error:&error];    
        if (error) {        
            NSLog (@"error: %@", error);        
            return;     
        }     
        AudioChannelLayout channelLayout;     
        memset(&channelLayout, 0, sizeof(AudioChannelLayout));     
        channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;    
    
        NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:                                     [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,                                     [NSNumber numberWithFloat:16000.0], AVSampleRateKey,                                     [NSNumber numberWithInt:2], AVNumberOfChannelsKey,                                     [NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey,                                     [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,                                     [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,                                     [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,                                     [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,                                    nil];    AVAssetWriterInput *assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio                                                                                outputSettings:outputSettings];    
        if ([assetWriter canAddInput:assetWriterInput]) {         
            [assetWriter addInput:assetWriterInput];     
        } else {        
            NSLog (@"can't add asset writer input... die!");        
            return;     
        }      
        assetWriterInput.expectsMediaDataInRealTime = NO;      
        [assetWriter startWriting];     
        [assetReader startReading];    
        AVAssetTrack *soundTrack = [songAsset.tracks objectAtIndex:0];     
        CMTime startTime = CMTimeMake (0, soundTrack.naturalTimeScale);     
        [assetWriter startSessionAtSourceTime:startTime];      
        __block UInt64 convertedByteCount = 0;    
        dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL);     
        [assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue                                             usingBlock: ^      {         
            while (assetWriterInput.readyForMoreMediaData) {              
                CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];             
                if (nextBuffer) {                 
                    // append buffer                  
                    [assetWriterInput appendSampleBuffer: nextBuffer];                 
    
                    NSLog (@"appended a buffer (%zu bytes)",                                      CMSampleBufferGetTotalSampleSize (nextBuffer));                  
                    convertedByteCount += CMSampleBufferGetTotalSampleSize (nextBuffer);                
                 } else {                  
                     [assetWriterInput markAsFinished];                  
                     [assetWriter finishWritingWithCompletionHandler:^{                   
                     }];                  
                     [assetReader cancelReading];                 
    
                     NSDictionary *outputFileAttributes = [[NSFileManager defaultManager]                                                        attributesOfItemAtPath:[destUrl path]                                                        error:nil];                 
                    NSLog (@"FlyElephant %lld",[outputFileAttributes fileSize]);                 
    
                    break;              
                }          
             }       
        }]; 
    }

    参考链接:http://subfurther.com/blog/2010/12/13/from-ipod-library-to-pcm-samples-in-far-fewer-steps-than-were-previously-necessary/

  • 相关阅读:
    Flask--配置文件
    Flask--路由系统
    Flask--视图
    Flask--蓝图
    Flask--静态资源
    Flask--登录验证(多个装饰器)
    Flask--session
    CSS中的定位机制
    四、DDL常见操作汇总
    三、管理员必备技能
  • 原文地址:https://www.cnblogs.com/isItOk/p/5891142.html
Copyright © 2020-2023  润新知