gpt4 book ai didi

ios - AVAssetExportSession 停止进行

转载 作者:IT王子 更新时间:2023-10-29 08:20:29 24 4
gpt4 key购买 nike

我在使用 AVAssetExportSession 时遇到问题,进度停止增加,但状态仍然显示它正在导出。这实际上是一种非常罕见的情况,它在大约 99.99% 的时间内都可以完美运行,但我还是想解决这个问题。

所以我开始导出:

    exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality];
exportSession.videoComposition = videoComposition;
exportSession.outputFileType = @"com.apple.quicktime-movie";
exportSession.outputURL = outputURL;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
...
}];

然后有一个计时器检查进度:

    AVAssetExportSessionStatus status = [exportSession status];
float progress = 0;
if (status == AVAssetExportSessionStatusExporting) {
progress = [exportSession progress];
} else if (status == AVAssetExportSessionStatusCompleted) {
progress = 1;
}
NSLog(@"%d %f", status, progress);
[delegate processor:self didProgress:progress];

输出最终看起来像这样:

2012-05-23 14:28:59.494 **********[1899:707] 2 0.125991
2012-05-23 14:28:59.994 **********[1899:707] 2 0.185280
2012-05-23 14:29:00.494 **********[1899:707] 2 0.259393
2012-05-23 14:29:00.994 **********[1899:707] 2 0.326093
2012-05-23 14:29:01.494 **********[1899:707] 2 0.400206
2012-05-23 14:29:01.995 **********[1899:707] 2 0.481729
2012-05-23 14:29:02.495 **********[1899:707] 2 0.541019
2012-05-23 14:29:02.997 **********[1899:707] 2 0.622542
2012-05-23 14:29:03.493 **********[1899:707] 2 0.681832
2012-05-23 14:29:03.995 **********[1899:707] 2 0.763355
2012-05-23 14:29:04.494 **********[1899:707] 2 0.822645
2012-05-23 14:29:04.994 **********[1899:707] 2 0.880082
2012-05-23 14:29:05.493 **********[1899:707] 2 0.880082
2012-05-23 14:29:05.994 **********[1899:707] 2 0.880082
...
2012-05-23 14:43:22.994 **********[1899:707] 2 0.880082
2012-05-23 14:43:23.493 **********[1899:707] 2 0.880082
2012-05-23 14:43:23.994 **********[1899:707] 2 0.880082
2012-05-23 14:43:24.494 **********[1899:707] 2 0.880082

(注意:不是每次都停在同一个百分比,完全是随机的)

正如您从时间戳中看到的那样,前 88% 花费了 5 秒,然后我让它再运行 13 分钟(完整的视频处理通常不会超过 10 秒),没有任何变化进步。

目前我唯一的选择是检查进度在过去 X 秒内是否没有改变,然后告诉用户失败并重试。

有人有什么想法吗?

最佳答案

在我的案例中,这个问题源于使用异常配置编码的 mp4。但最终 Apple 代码中的错误导致了这个问题。

具体来说,我在 Facebook 上使用 mp4。似乎当 facebook 对视频进行编码时,它会丢弃或移动视频轨道的第一帧。使用 ffprobe 检查视频显示:

        "r_frame_rate": "722/25",
"avg_frame_rate": "722/25",
"time_base": "1/28880",
"start_pts": 1000,
"start_time": "0.034626",

0.034626 正好是第 2 帧的时间。然而,音轨从 0 开始。

不幸的是,Apple 的 API 无法正确报告轨道的开始时间。从 AVAsset 获取 AVAssetTrack 并检查其 timeRange 后,它报告开始时间为 0。我可能误解了轨道和 Assets 计时的性质,但这似乎是一个错误。

当然,在为导出 session 构建视频合成时,我使用了不正确的轨道时间范围。我怀疑当导出 session 在时间 0 时在轨道中查找数据但没有找到任何东西时它会感到困惑,然后正如我们所见,只是挂起并且甚至不报告错误 - 另一个错误。即使使用 videoCompositionWithPropertiesOfAsset: 创建合成也无济于事。

我还没有尝试使用 AVAssetReader 和 AVAssetWriter 而不是 AVAssetExportSession 所以我不知道你是否会遇到同样的情况。在我有更多时间探索之前,我想出了这个 hack 作为解决方案:

将用于轨道插入和视频指令的时间范围重置为从 1 或 2 帧开始:

CMTimeRange videoTimeRange = videoTrack.timeRange;
videoTimeRange.start = CMTimeMake(1, ceil(videoTrack.nominalFrameRate));

显然,这个 hack 只适用于视频轨道开始时间不为 0 的特定情况。我猜想这个错误通常是由 AVAssetExportSession 及其相关类不期望的异常媒体编码引起的。

关于ios - AVAssetExportSession 停止进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com