2011-01-10 18 views
7

オーディオファイルの最後に録音する方法はありますか?録画を停止するのではなく、録画を一時停止することはできません。ユーザーが後でアプリに戻って録画に追加する必要があるためです。現在、オーディオはNSDataとしてCoreDataに格納されています。 NSDataのAppendDataは、元のデータと同じ長さのオーディオファイルしか出力されないため、機能しません。AVAudioRecorder/AVAudioPlayer - ファイルへの録音の追加

元のオーディオファイルと新しいオーディオファイルを別の方法で取り込んで、1つのオーディオファイルに連結することもできます。

+0

以下のコードを見てください。これは私がプロダクションアプリで使用しているものです。 – memmons

+0

あなたは私の完全な侮辱のためのコードを見つけることができます:https://stackoverflow.com/a/49136633/2244094 –

答えて

1

完全なコード例はありませんが、拡張オーディオファイルサービスは2つのオーディオファイルを連結するのに役立ちます。 Xcodeで拡張オーディオファイルサービスを検索するか、下記のリンクをご覧ください。

Apple documentation

+0

そのドキュメントには、追加するオーディオファイルを参照するものはありません。 – memmons

+0

正直言っておもしろいことですが、それがうまくいけば、準備が整ったファイルに連結したくないのですが、既存のファイルに書きたいと思っていて、その素晴らしい(リンゴレコーダーのように!) – KostiaZzz

4

次の2つのファイルを追加し、AVAssetExportSessionexportAsynchronouslyWithCompletionHandler方法を使用して構成をエクスポートした後AVMutableCompositionTrackを作成することによって、2つのオーディオファイルを追加することができます。

詳細については、以下のリンクを参照してください。

AVAssetExportSession Class Reference

Creating New Assets

これはあなたの問題を解決するのに役立ちます願っています。

+0

この答えは、私がこの同じ問題を思いついたときに正しい道を私に設定してください。 – kermitology

+0

私は以下の完全なコードを追加しましたが、これは私が正しい方向に指摘したこの答えでした。 – memmons

+0

@siddharthドキュメンテーションはどこから入手できましたか?リンゴのdocsのコピーのように見えますが、公式のappleのdocsにはそのセクションはありません。 – memmons

6

AVMutableComposionTrack insertTimeRange:ofTrack:atTime:errorを使用すると、これはかなり簡単に実行できます。コードはやや長めですが、実際には4ステップのようです:

// Create a new audio track we can append to 
AVMutableComposition* composition = [AVMutableComposition composition]; 
AVMutableCompositionTrack* appendedAudioTrack = 
    [composition addMutableTrackWithMediaType:AVMediaTypeAudio 
          preferredTrackID:kCMPersistentTrackID_Invalid]; 

// Grab the two audio tracks that need to be appended 
AVURLAsset* originalAsset = [[AVURLAsset alloc] 
    initWithURL:[NSURL fileURLWithPath:originalAudioPath] options:nil]; 
AVURLAsset* newAsset = [[AVURLAsset alloc] 
    initWithURL:[NSURL fileURLWithPath:newAudioPath] options:nil]; 

NSError* error = nil; 

// Grab the first audio track and insert it into our appendedAudioTrack 
AVAssetTrack *originalTrack = [originalAsset tracksWithMediaType:AVMediaTypeAudio]; 
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, originalAsset.duration); 
[appendedAudioTrack insertTimeRange:timeRange 
          ofTrack:[originalTrack objectAtIndex:0] 
          atTime:kCMTimeZero 
           error:&error]; 
if (error) 
{ 
    // do something 
    return; 
} 

// Grab the second audio track and insert it at the end of the first one 
AVAssetTrack *newTrack = [newAsset tracksWithMediaType:AVMediaTypeAudio]; 
timeRange = CMTimeRangeMake(kCMTimeZero, newAsset.duration); 
[appendedAudioTrack insertTimeRange:timeRange 
          ofTrack:[newTrack objectAtIndex:0] 
          atTime:originalAsset.duration 
           error:&error]; 

if (error) 
{ 
    // do something 
    return; 
} 

// Create a new audio file using the appendedAudioTrack  
AVAssetExportSession* exportSession = [AVAssetExportSession 
             exportSessionWithAsset:composition 
             presetName:AVAssetExportPresetAppleM4A]; 
if (!exportSession) 
{ 
    // do something 
    return; 
} 


NSString* appendedAudioPath= @""; // make sure to fill this value in  
exportSession.outputURL = [NSURL fileURLWithPath:appendedAudioPath]; 
exportSession.outputFileType = AVFileTypeAppleM4A; 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 

    // exported successfully? 
    switch (exportSession.status) 
    { 
     case AVAssetExportSessionStatusFailed: 
      break; 
     case AVAssetExportSessionStatusCompleted: 
      // you should now have the appended audio file 
      break; 
     case AVAssetExportSessionStatusWaiting: 
      break; 
     default: 
      break; 
    } 
    NSError* error = nil; 

}]; 
関連する問題