2011-09-12 11 views
6

मेरे पास एक AVURLASSet है जिसमें कई AVAssetTracks प्रकार ऑडियो हैं। मैं बटन को स्पर्श करके उपयोगकर्ता को इन अलग-अलग ऑडियो ट्रैक के बीच स्विच करने की अनुमति देना चाहता हूं। यह 1 ट्रैक की मात्रा को चालू और बंद करने के लिए काम कर रहा है लेकिन वॉल्यूम 1.0 पर सेट होने पर अन्य ट्रैक नहीं सुनाए जाते हैं।AVURLAsset के लिए ऑडियो ट्रैक को स्विच करें ऑडियो के विभिन्न AVAssetTracks के साथ

यहां ट्रैक की मात्रा समायोजित करने के लिए कोड है (प्रेषक ऑडियोट्रैक में संपत्ति के सूचकांक में टैग सेट के साथ एक UIButton है)।

AVURLAsset *asset = (AVURLAsset*)[[player currentItem] asset]; 
NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 


NSMutableArray *allAudioParams = [NSMutableArray array]; 
int i = 0; 
NSLog(@"%@", audioTracks); 
for (AVAssetTrack *track in audioTracks) { 
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
    float volume = i == sender.tag ? 1.0 : 0.0; 
    [audioInputParams setVolume:volume atTime:kCMTimeZero]; 
    [audioInputParams setTrackID:[track trackID]]; 
    [allAudioParams addObject:audioInputParams]; 
    i++; 
} 
AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix]; 
[audioZeroMix setInputParameters:allAudioParams]; 

[[player currentItem] setAudioMix:audioZeroMix]; 

क्या मुझे वांछित ट्रैक को सक्रिय होने के लिए कुछ करने की ज़रूरत है?

उत्तर

4

ठीक है समस्या मिली। उपरोक्त कोड से संबंधित नहीं था क्योंकि यह ठीक काम करता है। समस्या 1 ट्रैक के अलावा ऑडियो के लिए AVAssetTracks सक्षम नहीं थी। उन्हें सक्षम करने के लिए AVMutableComposition का उपयोग करके संपत्ति को फिर से बनाना था:

NSURL *fileURL = [[NSBundle mainBundle] 
        URLForResource:@"movie" withExtension:@"mp4"]; 

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil]; 

AVMutableComposition *composition = [AVMutableComposition composition]; 

AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
NSError* error = NULL; 

[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) 
           ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] 
           atTime:kCMTimeZero 
           error:&error]; 

NSArray *allAudio = [asset tracksWithMediaType:AVMediaTypeAudio]; 
for (int i=0; i < [allAudio count]; i++) { 
    NSError* error = NULL; 
    AVAssetTrack *audioAsset = (AVAssetTrack*)[allAudio objectAtIndex:i]; 

    AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) 
            ofTrack:audioAsset 
            atTime:kCMTimeZero 
            error:&error]; 

    NSLog(@"Error : %@", error); 

} 
+0

बहुत बहुत धन्यवाद! इससे काफी मदद मिली! –

+0

धन्यवाद, धन्यवाद, धन्यवाद! यह बहुत उपयोगी था! –

संबंधित मुद्दे