【问题标题】:iOS AVFoundation audio/video out of synciOS AVFoundation 音频/视频不同步
【发布时间】:2015-05-16 13:33:18
【问题描述】:

问题:

在每次播放过程中,音频比视频晚 1-2 秒。


设置:

资产通过媒体流中的 AVURLAssets 加载。

为了编写作品,我使用了 AVMutableCompositions 和 AVMutableCompositionTracks 的非对称时间尺度。音频和视频都流式传输到设备。音频的时间刻度是 44100;视频的时间刻度是 600。

播放是用 AVPlayer 完成的。


尝试的解决方案:

  • videoAssetTrack.timeRange 用于[composition insertTimeRange]
  • 使用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];
}

评论:

我不太了解 AVFoundation 框架。我完全有可能只是在滥用我提供的 sn-ps。 (即为什么“插入TimeRange”用于组合?)

我可以提供解决问题所需的任何其他信息 - 包括调试资产跟踪属性值、网络遥测、流信息等。

【问题讨论】:

  • 你解决过这个问题吗?我看到了同样的问题。我的光盘上有一个音轨和一个视频轨道,我需要同步播放它们,但如果我进行任何搜索,它们就会不同步。超级烦人。当视频和音频轨道没有被严重压缩时,效果也很好。
  • 你解决过这个问题吗?我也有同样的问题stackoverflow.com/q/44040604/5085393

标签: ios objective-c avfoundation avplayer audio-video-sync


【解决方案1】:

如果一致,则似乎存在强制延迟以正确采样音频。 Apple 的指南通常比随附的书籍更容易阅读,但这里是关于延迟的具体说明。

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

编程指南将详细说明原因/内容。

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2018-04-03
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多