首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVMutableComposition中的黑框

AVMutableComposition中的黑框
EN

Stack Overflow用户
提问于 2012-02-01 17:19:14
回答 3查看 4.1K关注 0票数 9

这个问题与AVMutableComposition - Blank/Black frame between videos assets非常相关,但由于我没有使用AVAssetExportSession,所以答案并不适合我的问题。

我正在使用AVMutableComposition创建视频合成,并且我正在使用AVAssetReader读取它(我需要帧数据,我不能使用AVPlayer),但我的视频块之间经常有黑色帧(音频中没有明显的毛刺)。

我将我的组合创建为

代码语言:javascript
复制
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

NSMutableArray* durationList = [NSMutableArray array];
NSMutableArray* videoList= [NSMutableArray array];
NSMutableArray* audioList= [NSMutableArray array];

for (NSInteger i = 0; i < [clips count]; i++)
{
    AVURLAsset *myasset = [clips objectAtIndex:i];
    AVAssetTrack *clipVideoTrack = [[myasset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    [videoList addObject:clipVideoTrack];

    AVAssetTrack *clipAudioTrack = [[myasset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    [audioList addObject:clipAudioTrack];

    CMTime clipDuration = [myasset duration];
    CMTimeRange clipRange = CMTimeRangeMake(kCMTimeZero, clipDuration);
    [durationList addObject:[NSValue valueWithCMTimeRange:clipRange]];
}

[compositionVideoTrack insertTimeRanges:durationList ofTracks:videoList atTime:kCMTimeZero error:nil];
[compositionAudioTrack insertTimeRanges:durationList ofTracks:audioList atTime:kCMTimeZero error:nil];

我也试着在我的作曲中手动插入每首曲目,但我也有同样的现象。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2013-10-10 20:31:22

经过几个小时的测试,我终于解决了这个问题。有两件事我需要改变。1)在创建资产时添加'precise‘选项。

代码语言:javascript
复制
 NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey:@YES};
 AVURLAsset *videoAsset3 = [AVURLAsset URLAssetWithURL:clip3URL options:options];

2)不要使用

代码语言:javascript
复制
CMTime duration3 = [videoAsset3 duration];

改为使用

代码语言:javascript
复制
AVAssetTrack *videoAsset3Track = [[videoAsset3 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CMTime duration3 = videoAsset3Track.timeRange.duration;

在我将AVPlayer的背景颜色设置为蓝色后,我发现了这一点,然后我注意到出现了蓝色的框架,所以问题出在计时上。一旦我更改到上面的设置,不同的视频在使用时可以很好地对齐:

代码语言:javascript
复制
 AVMutableCompositionTrack *videoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                        preferredTrackID:kCMPersistentTrackID_Invalid];

[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration3)
                        ofTrack:videoAsset3Track
                         atTime:kCMTimeZero error:&error];
票数 25
EN

Stack Overflow用户

发布于 2012-08-20 20:27:43

尝试创建两个视频轨道,然后在添加剪辑时在这两个轨道之间交替。

票数 0
EN

Stack Overflow用户

发布于 2020-10-28 22:37:17

calculate Last CMTime对于insertTimeRange:非常重要对于新的AVAsset我遇到了同样的问题,并用以下方法解决了它:

代码语言:javascript
复制
 func addChunk(media: AVAsset) throws {
    let duration = self.mutableComposition.tracks.last?.timeRange.end
    try mutableComposition.insertTimeRange(CMTimeRange(start: .zero, duration: media.duration), of: media, at: duration ?? .zero)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9093347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档