2017-05-17 6 views
1

44100HzのサンプリングレートでオーディオフォーマットをAACフォーマットにエンコードしようとしています。そこで、基本的ios - ビデオのオーディオをAACに変換する

:入力(?MP3、AACなど、任意のサンプル・レート) - > AAC(44100Hz)

ソースオーディオがビデオ(MP4)から来ているが、私はM4Aにそれを抽出することができます(AAC) 。問題は、サンプルレートを44100Hzに変更することです。

私はAVAssetReaderとAVAssetWriterでこれを達成しようとしていますが、その可能性があるのか​​、それとも最善の解決策であるかはわかりません。他の解決策は非常に高く評価されるでしょう!ここで

は、これまでの私のコードです:

Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '*** -[AVAssetWriterInput 
appendSampleBuffer:] Cannot append sample buffer: Input buffer must 
be in an uncompressed format when outputSettings is not nil' 

すべてのヘルプははるかに高く評価されるだろう、おかげで:

// Input video audio (.mp4) 
    AVAsset *videoAsset = <mp4 video asset>; 
    NSArray<AVAssetTrack *> *videoAudioTracks = [videoAsset tracksWithMediaType:AVMediaTypeAudio]; 
    AVAssetTrack *videoAudioTrack = [videoAudioTracks objectAtIndex:0]; 

    // Output audio (.m4a AAC) 
    NSURL *exportUrl = <m4a, aac output file URL>; 

    // ASSET READER 
    NSError *error; 
    AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:videoAsset 
                   error:&error]; 
    if(error) { 
     NSLog(@"error:%@",error); 
     return; 
    } 

    // Asset reader output 
    AVAssetReaderOutput *assetReaderOutput =[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoAudioTrack 
                         outputSettings:nil]; 
    if(![assetReader canAddOutput:assetReaderOutput]) { 
     NSLog(@"Can't add output!"); 
     return; 
    } 

    [assetReader addOutput:assetReaderOutput]; 

    // ASSET WRITER 
    AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:exportUrl 
                  fileType:AVFileTypeAppleM4A 
                  error:&error]; 
    if(error) { 
     NSLog(@"error:%@",error); 
     return; 
    } 

    AudioChannelLayout channelLayout; 
    memset(&channelLayout, 0, sizeof(AudioChannelLayout)); 
    channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; 

    NSDictionary *outputSettings = @{AVFormatIDKey: @(kAudioFormatMPEG4AAC), 
      AVNumberOfChannelsKey: @2, 
      AVSampleRateKey: @44100.0F, 
      AVChannelLayoutKey: [NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], 
      AVEncoderBitRateKey: @64000}; 

    /*NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
            [NSNumber numberWithFloat:44100.f], 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];*/ 

    // Asset writer input 
    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]; 

    CMTime startTime = CMTimeMake (0, videoAudioTrack.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]; 
                 convertedByteCount += CMSampleBufferGetTotalSampleSize (nextBuffer); 

                 CMSampleBufferInvalidate(nextBuffer); 
                 CFRelease(nextBuffer); 
                 nextBuffer = NULL; 
                } 
                else 
                { 
                 [assetWriterInput markAsFinished]; 
                 //    [assetWriter finishWriting]; 
                 [assetReader cancelReading]; 

                 break; 
                } 
               } 
              }]; 

そして、ここでは、私はmp3オーディオトラックが含まれている映像と取得エラーです!

+0

PCMは、生のオーディオです - 圧縮されていない - それは、オーディオ、曲線上の点のシリーズです...最初の入力のオーディオファイルを変換しますPCMからPCMを選択された出力形式(aac)に変換する...このパターンは、コンバータロジックを簡略化します –

答えて

1

あなたのAVAssetReaderOutput出力設定を構成することによって、これを達成することができるはずです。

NSDictionary *readerOutputSettings = @{ AVSampleRateKey: @44100, AVFormatIDKey: @(kAudioFormatLinearPCM) }; 

AVAssetReaderOutput *assetReaderOutput =[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoAudioTrack 
                        outputSettings:readerOutputSettings]; 
関連する問題