2015-03-13 24 views
5

से बाहर वीडियो समस्या:आईओएस AVFoundation के ऑडियो/सिंक

हर प्लेबैक के दौरान, ऑडियो वीडियो के पीछे 1-2 सेकंड के बीच है।


सेटअप:

संपत्ति एक मीडिया स्ट्रीम से AVURLAssets डाले जाते हैं।

रचना लिखने के लिए, मैं AVMutableCompositions और AVMutableCompositionTracks को असममित टाइमकेल्स के साथ उपयोग कर रहा हूं। ऑडियो और वीडियो दोनों डिवाइस पर स्ट्रीम किए जाते हैं। ऑडियो के लिए टाइमकेल 44100 है; वीडियो के लिए टाइमकेल 600 है।

प्लेबैक AVPlayer के साथ किया जाता है।


का प्रयास किया गया समाधान:

  • [composition insertTimeRange] के लिए videoAssetTrack.timeRange का उपयोग करना।
  • CMTimeRangeMake(kCMTimeZero, videoAssetTrack.duration);
  • का उपयोग CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration);

कोड का उपयोग करना:

+(AVMutableComposition*)overlayAudio:(AVURLAsset*)audioAsset 
          withVideo:(AVURLAsset*)videoAsset 
{ 
    AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

    AVAssetTrack* audioTrack = [self getTrackFromAsset:audioAsset withMediaType:AVMediaTypeAudio]; 
    AVAssetTrack* videoTrack = [self getTrackFromAsset:videoAsset withMediaType:AVMediaTypeVideo]; 
    CMTime duration = videoTrack.timeRange.duration; 

    AVMutableCompositionTrack* audioComposition = [self composeTrack:audioTrack withComposition:mixComposition andDuration:duration andMedia:AVMediaTypeAudio]; 
    AVMutableCompositionTrack* videoComposition = [self composeTrack:videoTrack withComposition:mixComposition andDuration:duration andMedia:AVMediaTypeVideo]; 
    [self makeAssertionAgainstAudio:audioComposition andVideo:videoComposition]; 
    return mixComposition; 
} 

+(AVAssetTrack*)getTrackFromAsset:(AVURLAsset*)asset withMediaType:(NSString*)mediaType 
{ 
    return [[asset tracksWithMediaType:mediaType] objectAtIndex:0]; 
} 

+(AVAssetExportSession*)configureExportSessionWithAsset:(AVMutableComposition*)composition toUrl:(NSURL*)url 
{ 
    AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; 
    exportSession.outputFileType = @"com.apple.quicktime-movie"; 
    exportSession.outputURL = url; 
    exportSession.shouldOptimizeForNetworkUse = YES; 

    return exportSession; 
} 

-(IBAction)playVideo 
{ 
    [avPlayer pause]; 
    avPlayerItem = [AVPlayerItem playerItemWithAsset:mixComposition]; 
    avPlayer = [[AVPlayer alloc]initWithPlayerItem:avPlayerItem]; 

    avPlayerLayer =[AVPlayerLayer playerLayerWithPlayer:avPlayer]; 
    [avPlayerLayer setFrame:CGRectMake(0, 0, 305, 283)]; 
    [avPlayerLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
    [playerView.layer addSublayer:avPlayerLayer]; 

    [avPlayer seekToTime:kCMTimeZero]; 
    [avPlayer play]; 
} 

टिप्पणियाँ:

मुझे एवीफ़ाउंडेशन फ्रेमवर्क में से अधिकांश समझ में नहीं आता है। यह पूरी तरह से संभव है कि मैं बस प्रदान किए गए स्निपेट का दुरुपयोग कर रहा हूं। (यानी क्यों रचना के लिए "insertTimeRange"?)

मैं किसी भी अन्य जानकारी संकल्प के लिए आवश्यक प्रदान कर सकते हैं - डिबग संपत्ति ट्रैक संपत्ति मूल्यों, नेटवर्क टेलीमेटरी, स्ट्रीमिंग जानकारी सहित, आदि

+0

क्या आपने कभी इसे हल किया है? मैं एक ही मुद्दा देख रहा हूँ। मेरे पास एक ऑडियो ट्रैक और डिस्क पर एक वीडियो ट्रैक है जिसे मुझे सिंक्रनाइज़ करने के लिए वापस खेलने की आवश्यकता है, लेकिन अगर मैं कोई मांग करता हूं तो वे सिंक से बाहर निकलते रहते हैं। यह बहुत परेशान है। पूरी तरह से काम किया जब वीडियो और ऑडियो ट्रैक भी भारी संपीड़ित नहीं थे। –

+0

क्या आपने कभी यह हल किया है ?, मेरे पास एक ही समस्या है https://stackoverflow.com/q/44040604/5085393 –

उत्तर

1

यदि यह सुसंगत है, यह वहाँ प्रकट होता है ऑडियो को सही तरीके से नमूना देने में एक लागू देरी है। ऐप्पल के गाइड आमतौर पर उनके साथ की किताबों की तुलना में पढ़ने के लिए आसान होते हैं, हालांकि देरी पर विशिष्ट नोट यहां दिया गया है।

https://developer.apple.com/library/ios/technotes/tn2258/_index.html

प्रोग्रामिंग गाइड होगा विस्तार क्यों/क्या।

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