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
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. –
Hai mai risolto questo problema? Ho lo stesso numero https://stackoverflow.com/q/44040604/5085393 –