2015-03-13 21 views
5

Il problema:iOS AVFoundation audio/video fuori sincrono

Durante ogni riproduzione, l'audio è tra i 1-2 secondi dietro il video.


Il Setup:

Le attività sono caricati con AVURLAssets da un flusso multimediale.

Per scrivere la composizione, sto utilizzando AVMutableCompositions e AVMutableCompositionTracks con intervalli di tempo asimmetrici. L'audio e il video sono entrambi trasmessi in streaming sul dispositivo. La scala cronologica per l'audio è 44100; la scala cronologica per il video è 600.

La riproduzione viene eseguita con AVPlayer.


Solutions Tentativo:

  • Uso videoAssetTrack.timeRange per [composition insertTimeRange].
  • Utilizzando CMTimeRangeMake(kCMTimeZero, videoAssetTrack.duration);
  • Utilizzando CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration);

Il Codice:

+(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]; 
} 

Commenti:

Non capisco molto del framework AVFoundation. È del tutto probabile che sto semplicemente abusando dei frammenti che ho fornito. (Vale a dire il motivo per cui "insertTimeRange" per la composizione?)

Posso fornire ogni altra informazione necessaria per la risoluzione - compresi i valori delle proprietà di debug traccia di attività, telemetria di rete, le informazioni in streaming, ecc

+0

Hai mai risolto questo? Sto vedendo lo stesso problema. Ho una traccia audio e una traccia video sul disco che ho bisogno di riprodurre sincronizzati, ma continuano a cadere fuori sincrono se faccio qualsiasi ricerca. È super fastidioso. Funzionava perfettamente anche quando le tracce video e audio non erano pesantemente compresse. –

+0

Hai mai risolto questo problema? Ho lo stesso numero https://stackoverflow.com/q/44040604/5085393 –

risposta

1

Se è coerente, sembra che ci è un ritardo forzato per campionare correttamente l'audio. Le guide Apple sono di solito più facili da leggere rispetto ai loro libri di accompagnamento, tuttavia qui è la nota specifica sul ritardo.

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

Le guide di programmazione saranno i dettagli perché/cosa.

Problemi correlati