2012-02-01 15 views
7

में ब्लैक फ्रेम AVMutableComposition - Blank/Black frame between videos assets से काफी संबंधित है लेकिन जैसा कि मैं AVAssetExportSession का उपयोग नहीं कर रहा हूं, उत्तर मेरी समस्या के अनुरूप नहीं हैं।AVMutableComposition

मैं एक वीडियो रचना बनाने के लिए एक AVMutableComposition का उपयोग कर रहा हूं और मैं इसे एक AVAssetReader का उपयोग कर पढ़ रहा हूं (मुझे फ्रेम डेटा होना चाहिए, मैं एवीप्लेयर का उपयोग नहीं कर सकता) लेकिन मेरे पास अक्सर मेरे वीडियो के बीच काले फ्रेम होते हैं भाग (ऑडियो में कोई गड़बड़ नहीं है)।

मैं अपने संरचना बनाने के रूप में

AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

NSMutableArray* durationList = [NSMutableArray array]; 
NSMutableArray* videoList= [NSMutableArray array]; 
NSMutableArray* audioList= [NSMutableArray array]; 

for (NSInteger i = 0; i < [clips count]; i++) 
{ 
    AVURLAsset *myasset = [clips objectAtIndex:i]; 
    AVAssetTrack *clipVideoTrack = [[myasset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    [videoList addObject:clipVideoTrack]; 

    AVAssetTrack *clipAudioTrack = [[myasset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    [audioList addObject:clipAudioTrack]; 

    CMTime clipDuration = [myasset duration]; 
    CMTimeRange clipRange = CMTimeRangeMake(kCMTimeZero, clipDuration); 
    [durationList addObject:[NSValue valueWithCMTimeRange:clipRange]]; 
} 

[compositionVideoTrack insertTimeRanges:durationList ofTracks:videoList atTime:kCMTimeZero error:nil]; 
[compositionAudioTrack insertTimeRanges:durationList ofTracks:audioList atTime:kCMTimeZero error:nil]; 

मैं अपने संरचना में मैन्युअल रूप से प्रत्येक ट्रैक को सम्मिलित करने की कोशिश की, लेकिन मैं एक ही घटना है।

धन्यवाद

+0

क्या आपने कभी इस समस्या को हल किया था? मुझे एक समान समस्या मिल रही है। – elprl

+0

@elprl मैंने अपने कोड पर एक नज़र डाली और यह काफी समान रहा। मुझे लगता है कि हम tweaking (कुंजी फ्रेम अंतराल, framerate, ...) वीडियो प्रारूप इनपुट (हम इसे नियंत्रित कर सकते हैं) द्वारा इस मुद्दे को "तय" किया है। यह बहुत समय पहले था और मैं यह सुनिश्चित नहीं कर सकता कि पैरामीटर ने स्थिति में सुधार किया है। – chub

उत्तर

0

जब क्लिप जोड़ने दो वीडियो पटरियों बनाने दोनों के बीच वैकल्पिक प्रयास करें, और उसके बाद।

19

मैंने कई घंटों के परीक्षण के बाद इस समस्या को हल करने में कामयाब रहे। बदलने के लिए मुझे दो चीजें जरूरी हैं। 1) संपत्ति बनाते समय 'सटीक' विकल्प जोड़ें।

NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey:@YES}; 
AVURLAsset *videoAsset3 = [AVURLAsset URLAssetWithURL:clip3URL options:options]; 

2) का उपयोग नहीं करते

CMTime duration3 = [videoAsset3 duration]; 

उपयोग बजाय

AVAssetTrack *videoAsset3Track = [[videoAsset3 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
CMTime duration3 = videoAsset3Track.timeRange.duration; 

मैं इस में पता चला के बाद मैं ब्लू को AVPlayer पृष्ठभूमि रंग निर्धारित करते हैं, तो मैं प्रदर्शित होने नीले फ्रेम देखा, तो समस्या समय के साथ करना था। एक बार जब मैं ऊपर सेटिंग्स में बदल जाता हूं, तो विभिन्न वीडियो का उपयोग करते समय ठीक से गठबंधन किया जाता है:

AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
                     preferredTrackID:kCMPersistentTrackID_Invalid]; 

[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration3) 
         ofTrack:videoAsset3Track 
         atTime:kCMTimeZero error:&error]; 
+2

धन्यवाद @elprl .. यह सही काम करता है – MAMN84