2016-07-18 5 views
2

私のアプリでは、複数のオーディオファイルを組み合わせました(.m4a)。オーディオファイルを結合するには、私は以下のコードを使用します。tracksWithMediaTypeが0トラックを返す場合があります

CMTime nextClipStartTime = kCMTimeZero; 
AVMutableComposition *composition = [[AVMutableComposition alloc] init]; 
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 


for(NSString * str in filesNamesArray) 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:str]; 
    NSURL *url = [[NSURL alloc] initFileURLWithPath:path]; 

    AVAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:nil]; 

    NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio]; 
    if ([tracks count] == 0) 
    { 
     NSLog(@"Tracks = %lu",(unsigned long)[tracks count]); 
     return; 
    } 
    NSLog(@"%@",avAsset); 
    CMTimeRange timeRangeInAsset = CMTimeRangeMake(kCMTimeZero, [avAsset duration]); 
    AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    ok = [compositionAudioTrack insertTimeRange:timeRangeInAsset ofTrack:clipAudioTrack atTime:nextClipStartTime error:&error]; 
    if (!ok) { 
     NSLog(@"Current Video Track Error: %@",error); 
    } 
    nextClipStartTime = CMTimeAdd(nextClipStartTime, timeRangeInAsset.duration); 
} 

時には 'tracksWithMediaType'が空の配列を返します。なぜこのようなことが起こっていて、どんな助けにも大いに感謝します。

答えて

1

あなたがAVAssetを作成する場合:

AVAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:nil]; 

資産が使用するために準備する前にそのトラックをロードしている必要があります。

[avAsset loadValuesAsynchronouslyForKeys:@"tracks" completionHandler: ^{ 
AVKeyValueStatus status = [avAsset statusOfValueForKey:@"tracks" error:nil]; 
if (status == AVKeyValueStatusLoaded) { 
    // Asset is ready now 

} 
}]; 
関連する問題