Параметр требуется для преобразования .caf в формат .wav? - PullRequest
1 голос
/ 09 февраля 2012

Я хочу преобразовать записанный файл .caf в файл .wav.Я пытаюсь использовать

OSStatus AudioFileCreateWithURL( CFURLRef   inFileRef, AudioFileTypeID   inFileType,const AudioStreamBasicDescription *inFormat, UInt32   inFlags,AudioFileID  *outAudioFile);

по вышеуказанному методу. Я застрял при установке двух параметров, я имею в виду, какой параметр мне нужно установить в
const AudioStreamBasicDescription * inFormat и в UInt32 inFlags,AudioFileID *outAudioFile.

И в размещении я пытаюсь использовать следующий метод

- (id)initWithURL:(NSURL *)url settings:(NSDictionary *)settings error:(NSError **)outError

Снова я застрял на настройках: (NSDictionary *) настройки, я имею в виду, какой параметр я должен установить или использовать для преобразования из .caf вWAV-файл.

Скажите, пожалуйста, существует ли какое-либо другое решение в iphone ???

1 Ответ

3 голосов
/ 10 февраля 2012

// Здесь отправляем путь к вашему файлу, где вы сохранили .caf файл

-(BOOL)exportAssetAsWaveFormat:(NSString*)filePath                  
{
    NSError *error = nil ;

    NSDictionary *audioSetting = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [ NSNumber numberWithFloat:44100.0], AVSampleRateKey,
                                  [ NSNumber numberWithInt:2], AVNumberOfChannelsKey,
                                  [ NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
                                  [ NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
                                  [ NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, 
                                  [ NSNumber numberWithBool:0], AVLinearPCMIsBigEndianKey,
                                  [ NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
                                  [ NSData data], AVChannelLayoutKey, nil ];

    NSString *audioFilePath = filePath;
    AVURLAsset * URLAsset = [[AVURLAsset alloc]  initWithURL:[NSURL fileURLWithPath:audioFilePath] options:nil];

    if (!URLAsset) return NO ;

    AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:URLAsset error:&error];
    if (error) return NO;

    NSArray *tracks = [URLAsset tracksWithMediaType:AVMediaTypeAudio];
    if (![tracks count]) return NO;

    AVAssetReaderAudioMixOutput *audioMixOutput = [AVAssetReaderAudioMixOutput
                                                   assetReaderAudioMixOutputWithAudioTracks:tracks
                                                   audioSettings :audioSetting];

    if (![assetReader canAddOutput:audioMixOutput]) return NO ;

    [assetReader addOutput :audioMixOutput];

    if (![assetReader startReading]) return NO;



    NSString *title = @"WavConverted";
    NSArray *docDirs = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [docDirs objectAtIndex: 0];
    NSString *outPath = [[docDir stringByAppendingPathComponent :title]
                         stringByAppendingPathExtension:@"wav" ];

    NSURL *outURL = [NSURL fileURLWithPath:outPath];
    AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:outURL
                                                          fileType:AVFileTypeWAVE
                                                             error:&error];
    if (error) return NO;

    AVAssetWriterInput *assetWriterInput = [ AVAssetWriterInput assetWriterInputWithMediaType :AVMediaTypeAudio
                                                                                outputSettings:audioSetting];
    assetWriterInput. expectsMediaDataInRealTime = NO;

    if (![assetWriter canAddInput:assetWriterInput]) return NO ;

    [assetWriter addInput :assetWriterInput];

    if (![assetWriter startWriting]) return NO;


    [assetReader retain];
    [assetWriter retain];

    [assetWriter startSessionAtSourceTime:kCMTimeZero ];

    dispatch_queue_t queue = dispatch_queue_create( "assetWriterQueue", NULL );

    [assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{

        NSLog(@"start");

        while (1)
        {
            if ([assetWriterInput isReadyForMoreMediaData]) {

                CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];

                if (sampleBuffer) {
                    [assetWriterInput appendSampleBuffer :sampleBuffer];
                    CFRelease(sampleBuffer);
                } else {
                    [assetWriterInput markAsFinished];
                    break;
                }
            }
        }

        [assetWriter finishWriting];
        [assetReader release ];
        [assetWriter release ];

        NSLog(@"finish");
    }];

    dispatch_release(queue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...