longitachi / ZLPhotoBrowser

Wechat-like image picker. Support select photos, videos, gif and livePhoto. Support edit image and crop video. 微信样式的图片选择器,支持预览/相册内拍照及录视频、拖拽/滑动选择,编辑图片/视频,支持多语言国际化等功能;
MIT License
4.72k stars 953 forks source link

截取的视频,最后不到1秒的画面缺失 #793

Closed ElvistLui closed 8 months ago

ElvistLui commented 1 year ago

Issue Description

截取的视频,最后不到1秒的画面缺失

Description and Steps

  1. 设置选择视频上限为60秒;
  2. 在ZL相册内选择一个2分钟的视频;
  3. 截取该视频的最后60秒;
  4. 截取后的视频,相比于原视频,缺失了最后不到1秒的画面;

Info

ZLPhotoBrowser version: e.g. 4.3.7 Device: e.g. iPhone 14Pro Device version: e.g. iOS 16.1.2 Xcode version: e.g. Xcode 14.1

Configuration code of ZLPhotoConfiguration

+ (void)selectVideoFor:(UIViewController *)vc asset:(PHAsset *)asset selectedBlock:(void (^)(ZLResultModel * _Nonnull))selectedBlock cancelBlock:(void (^)(void))cancelBlock {

    int maxVideoTime = 60;
    // 配置
    [ZLPhotoConfiguration default].allowMixSelect = NO;
    [ZLPhotoConfiguration default].allowSelectImage = NO;
    [ZLPhotoConfiguration default].allowSelectVideo = YES;
    [ZLPhotoConfiguration default].maxSelectCount = 1;
    [ZLPhotoConfiguration default].maxVideoSelectCount = 1;
    [ZLPhotoConfiguration default].maxEditVideoTime = maxVideoTime;
    [ZLPhotoConfiguration default].maxSelectVideoDuration = 3600; // 暂时显示不能选择超过1小时的视频
    [ZLPhotoConfiguration default].allowEditVideo = YES;
    [ZLPhotoConfiguration default].saveNewImageAfterEdit = YES;
    [ZLPhotoConfiguration default].minRecordDuration = 3;
    [ZLPhotoConfiguration default].maxRecordDuration = 60;
    [ZLPhotoConfiguration default].editAfterSelectThumbnailImage = YES; // 点击视频时,直接点击进入编辑页

    [ZLPhotoUIConfiguration default].languageType = ZLLanguageTypeChineseSimplified;

    ZLPhotoPreviewSheet *ps = [[ZLPhotoPreviewSheet alloc] initWithSelectedAssets:asset ? @[asset] : @[]];
    ps.selectImageBlock = ^(NSArray<ZLResultModel *> * _Nonnull results, BOOL isOriginal) {

        if (selectedBlock) {
            selectedBlock(results.firstObject);
        }
    };
    ps.cancelBlock = ^{

        if (cancelBlock) {
            cancelBlock();
        }
    };
    [ps showPhotoLibraryWithSender:vc];
}
jiaoyaxin commented 8 months ago

从旧版本迁移到新版本也是 我10分钟到视频最后40多秒都丢了. 计算截取时间时的开始时间是用两个view的位置差算出来的. 但是这两个view宽不是1:1的, 也没进行数值转换, 直接就使用了.

jiaoyaxin commented 8 months ago

ZLEditVideoController

collectionView 和 editView 宽度不一样, _interval * rect.origin.x / (kItemWidth)这样算的前提是他两宽度一样才行.

longitachi commented 8 months ago

@jiaoyaxin 把config的配置发一下吧,我抽空试一下

jiaoyaxin commented 8 months ago
[ZLPhotoConfiguration default].maxSelectCount = 1;
[ZLPhotoConfiguration default].maxPreviewCount = 20;
[ZLPhotoConfiguration default].allowSelectImage = NO;
[ZLPhotoConfiguration default].allowEditVideo = YES;
[ZLPhotoConfiguration default].maxSelectVideoDuration = 600;
[ZLPhotoConfiguration default].maxEditVideoTime = 600;
[ZLPhotoConfiguration default].cameraConfiguration.maxRecordDuration = 180;
[ZLPhotoUIConfiguration default].showSelectBtnWhenSingleSelect = YES;
longitachi commented 8 months ago

能说下具体操作步骤吗,我这边试了下一个336s的视频,设置maxEditVideoTime = 300,试了下裁剪出来的视频长度就是300s

jiaoyaxin commented 8 months ago

进去直接拉到最后,选择最后300s, 预期值应该是(36,300).

ElvistLui commented 8 months ago

@longitachi 我这截取的视频时长没问题,是截取的起始位置不对。 举个例子,我设置 [ZLPhotoConfiguration default].maxEditVideoTime = 60; 然后选择一个2分钟的视频,选择截取最后60秒。按理说截取的应该是原视频的(60,120),但实际截取的却是(58:118)。 这样就导致了视频最后几秒丢失了

longitachi commented 8 months ago

@longitachi 我这截取的视频时长没问题,是截取的起始位置不对。 举个例子,我设置 [ZLPhotoConfiguration default].maxEditVideoTime = 60; 然后选择一个2分钟的视频,选择截取最后60秒。按理说截取的应该是原视频的(60,120),但实际截取的却是(58:118)。 这样就导致了视频最后几秒丢失了

好的,我之前理解错了,我以为是时长少了。