使用 AVMutableVideoComposition 时 AVMutableComposition 冻结的奇怪行为

2024-04-09

我正在尝试使用合并多个视频AVMutableComposition。我面临的问题是,每当我尝试添加任何AVMutableVideoComposition为了应用任何指令,我的播放冻结在AVPlayer持续时间正好 6 秒。

另一个有趣的事情是,如果我在使用相同的导出后在 iPad 的照片应用程序中播放它,它会播放得很好videoComposition。那么为什么它会冻结AVPlayer6秒?

Code:

AVMutableComposition *mutableComposition = [AVMutableComposition composition];

    AVMutableCompositionTrack *videoCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                                        preferredTrackID:kCMPersistentTrackID_Invalid];

    AVMutableCompositionTrack *audioCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                                       preferredTrackID:kCMPersistentTrackID_Invalid];

    for (AVURLAsset *asset in assets)
    {
            AVAssetTrack *assetTrack;
            assetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
            AVAssetTrack *audioAssetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject;


            NSError *error;
            [videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, assetTrack.timeRange.duration )
                                                   ofTrack:assetTrack
                                                    atTime:time
                                                     error:&error];

            if (error) {
                NSLog(@"asset url :: %@",assetTrack.asset);
                NSLog(@"Error1 - %@", error.debugDescription);
            }

            [audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack.timeRange.duration)
                                               ofTrack:audioAssetTrack
                                                atTime:time
                                                 error:&error];

            if (error) {
                NSLog(@"Error2 - %@", error.debugDescription);
            }

            time = CMTimeAdd(time, assetTrack.timeRange.duration);

            if (CGSizeEqualToSize(size, CGSizeZero)) {
                size = assetTrack.naturalSize;;
            }
        }

        AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
        AVMutableVideoCompositionLayerInstruction *videoTrackLayerInstruction =  [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoCompositionTrack];

        mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, time);
        mainInstruction.layerInstructions = [NSArray arrayWithObjects:videoTrackLayerInstruction, nil];
        AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition];
        mainCompositionInst.instructions = [NSArray arrayWithObject:mainInstruction];
        mainCompositionInst.frameDuration = CMTimeMake(1, 30);
        mainCompositionInst.renderSize = size;

        pi = [AVPlayerItem playerItemWithAsset:mutableComposition];
        pi.videoComposition = mainCompositionInst;

另外,我知道问题主要是videoComposition因为如果我删除videoComposition,然后它就可以正常运行AVPlayer.

UPDATE 1:我刚刚发现,当它在 6 秒后冻结时,如果我向后或向前拖动滑块(即使用seekToTime),它再次开始正常播放,不再卡顿。

即使视频冻结,音频也能正常播放。

UPDATE 2:如果我继续使用AVAssetExportSession与相同AVMutableComposition,并从导出的视频加载资源,效果很好。所以只是当我玩的时候AVMutableComposition直接,问题就出现了。


最后,我找到了解决这个问题的解决方案。

您应该在playerItem 的状态更改为.ReadyToPlay 后开始播放。

请看如下。

func startVideoPlayer() {
    let playerItem = AVPlayerItem(asset: self.composition!)
    playerItem.videoComposition = self.videoComposition!

    let player = AVPlayer(playerItem: playerItem)
    player.actionAtItemEnd = .None

    videoPlayerLayer = AVPlayerLayer(player: player)
    videoPlayerLayer!.frame = self.bounds

    /* add playerItem's observer */
    player.addObserver(self, forKeyPath: "player.currentItem.status", options: .New, context: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem);

    self.layer.addSublayer(videoPlayerLayer!)
}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
    if keyPath != nil && keyPath! == "player.currentItem.status" {
        if let newValue = change?[NSKeyValueChangeNewKey] {
            if AVPlayerStatus(rawValue: newValue as! Int) == .ReadyToPlay {
                playVideo() /* play after status is changed to .ReadyToPlay */
            }
        }
    } else {
        super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
    }
}    

func playerItemDidReachEnd(notification: NSNotification) {
    let playerItem = notification.object as! AVPlayerItem
    playerItem.seekToTime(kCMTimeZero)

    playVideo()
} 

func playVideo() {
    videoPlayerLayer?.player!.play()
}       
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 AVMutableVideoComposition 时 AVMutableComposition 冻结的奇怪行为 的相关文章

随机推荐

  • SNMP 错误,端口已在使用中

    我创建了一个 SNMP 代理模拟器应用程序 它对模拟设备使用端口号 161 有时会出现端口已使用异常 如何知道161端口是否繁忙 只需启动您的应用程序即可 如果它收到 BindException 则该端口正在使用中 如果没有 您的应用程序可
  • 如何在设定时间后关闭 ProgressDialog?

    我试图在 3 秒后自动关闭 ProgressDialog 框 这是对话框 ProgressDialog progress new ProgressDialog this progress setTitle Connecting progre
  • 如何在C#中通过解析Xml创建表达式树?

    我希望通过使用 C 解析 xml 来创建表达式树 xml 如下所示
  • 如何创建历史事实表?

    我的数据仓库中有一些实体 Person 具有 personId dateFrom dateTo 和其他可以更改的属性 例如姓氏 出生日期等 缓慢变化的维度 Document 文档 ID 编号 类型 Address 地址 ID 城市 街道 房
  • 阻止 Hibernate 创建非空约束

    有没有办法阻止 Hibernate 为带有注释的属性创建非空约束 javax validation constraints NotNull使用时hbm2ddl create 来自 Hibernate Validator 的文档 6 1 数据
  • 对包含空标记的字符串进行标记

    我有一个看似简单的问题 就是用逗号分隔String到令牌中 在以下情况下输出应包含空令牌 中的第一个字符String是一个逗号 中的最后一个字符String是一个逗号 出现两个连续的逗号 例如 对于String abd def ghi 应该
  • Java XMLGregorianCalendar 转换为 Java util.Date 时存在错误?

    我正在将日期 时间值写入 XML 文件 方法是从基于 RAP 的 UI 中读取日期作为 Java Date 对象 并将其作为XMLGregorianCalendar反对实际的文件编写代码 相应的类是自动生成的 我无法控制它们 我输入的日期是
  • Java中String(String)构造函数的使用[重复]

    这个问题在这里已经有答案了 我读过的文章和书籍使用String s new String 应该一直避免 我明白为什么会这样 但是使用 String String 构造函数有什么用处吗 我认为不存在 也没有看到任何其他证据 但我想知道 SO
  • 层位置在(核心)动画开始时跳跃

    因此 我尝试创建一个平铺翻转效果 就像在 Windows Phone 7 上一样 到目前为止 我有以下代码 但我有几个疑问 CALayer layer self theRedSquare layer CATransform3D initia
  • C++ 函数导致应用程序崩溃且无法正常工作

    我的应用程序中出现了一个问题 我的 PrintAll 函数无法正常工作 最终只会使我的应用程序崩溃 我的应用程序应该从文件中读取字符串并将它们插入到数组中 问题是它读取不正确 最终会使我的应用程序崩溃 我认为问题出在这儿 int main
  • 如何使用绘图中的范围分隔符?

    我想使用plotly从某些图中的x轴中删除某些间隔 我找到了随附的示例https plotly com python time series https plotly com python time series 但运行它给了我错误 Val
  • 如何从 Twitter 的 firebase 用户获取 @user

    我试图在通过 firebase 登录 Twitter 后访问 Twitter 用户名 但 getDisplayName 方法返回用户名 而不是 有任何想法吗 我已经尝试过这个 FirebaseAuth getInstance getCurr
  • 如何找出一个类属于哪个依赖项?

    我正在使用 m2eclipse 我想在新项目中重用以前项目的一些依赖项 我知道我想使用哪个类 但我似乎无法找出它到底属于哪个依赖项 如果 eclipse 只是告诉我它从中加载的 jar 的名称 我会很高兴 我怀疑有一种方法可以在 Eclip
  • 如何获取字典中的键列表?

    我只想要字典的键而不是值 我还无法获得任何代码来执行此操作 事实证明 使用另一个数组的工作量太大 因为我也使用了删除 如何获取字典中的键列表 Use the Dictionary
  • int 可以别名为 unsigned int 吗? [复制]

    这个问题在这里已经有答案了 编译器生成代码假设int可以通过一个别名unsigned int 下面的代码 int f int a unsigned int b a 10 b 12 return a int f int a double b
  • 为什么这种双重检查锁定是正确的? (。网)

    我读过很多关于双重检查锁定的危险的文章 我会尽力避免它 但话虽如此 我认为他们读起来非常有趣 我正在阅读 Joe Duffy 的这篇关于使用双重检查锁定实现单例的文章 http www bluebytesoftware com blog P
  • 在 iPhone 上复制并粘贴多种数据表示形式

    当我尝试将多个数据表示放到 iPhone 3 0 的粘贴板上时 遇到了一些问题 我想做的是将数据表示形式和字符串表示形式放到粘贴板上 数据是我自己的数据类型 我用它来复制和粘贴到我的应用程序中 字符串表示形式是一种将应用程序的内容作为大纲复
  • 如何配置具有两个端点的 WCF 服务,以便为每个端点使用不同的 ListenUri?

    我有一个 WCF 服务 它使用以下方式公开端点webHttpBinding并由 WPF 和 ASP NET 应用程序使用 一切都很好 我现在尝试从 Windows Phone WP7 使用该服务 然而 由于 NET Framework 还没
  • 如何在 firebase auth web 中存储用户名和 photourl

    我正在尝试 firebase 身份验证 我想在用户注册时存储照片网址和用户名 我的注册代码 const email signupForm email value const password signupForm password valu
  • 使用 AVMutableVideoComposition 时 AVMutableComposition 冻结的奇怪行为

    我正在尝试使用合并多个视频AVMutableComposition 我面临的问题是 每当我尝试添加任何AVMutableVideoComposition为了应用任何指令 我的播放冻结在AVPlayer持续时间正好 6 秒 另一个有趣的事情是