Skip to content

快速开始 ​

本页从相册中选取一个视频,用编辑器打开它,然后读取裁剪后的文件。开始前请先安装本库并重新构建应用。

1. 选择文件 ​

本库不负责录制或选择媒体,只裁剪你已有的文件。任何能返回本地 URI 的选择器都可以。本示例使用 react-native-image-picker:

ts
import { launchImageLibrary } from 'react-native-image-picker';

async function pickVideo(): Promise<string | null> {
  const result = await launchImageLibrary({
    mediaType: 'video',
    assetRepresentationMode: 'current',
  });
  return result.assets?.[0]?.uri ?? null;
}

2. 打开编辑器 ​

ts
import { showEditor } from 'react-native-video-trim';

const uri = await pickVideo();
if (uri) {
  showEditor(uri, {
    maxDuration: 60_000, // 最长 60 秒
    saveToPhoto: true, // 同时将结果保存到相册
  });
}

所有时间均以毫秒为单位

maxDuration、minDuration、startTime、endTime、jumpToPositionOnLoad 以及事件数据中的时间都是毫秒。maxDuration: 20 表示 20 毫秒,而不是 20 秒。

showEditor() 会立即返回。请始终传入选项对象,没有选项时也要传空对象:showEditor(uri, {})。

3. 获取结果 ​

编辑器通过事件通知你后续的进展。在新架构下,通过默认导出订阅这些事件:

tsx
import { useEffect } from 'react';
import VideoTrim from 'react-native-video-trim';

export function useTrimResult(onDone: (path: string) => void) {
  useEffect(() => {
    const subs = [
      VideoTrim.onFinishTrimming(({ outputPath, startTime, endTime, duration }) => {
        console.log({ startTime, endTime, duration });
        onDone(outputPath);
      }),
      VideoTrim.onError(({ message, errorCode }) => {
        console.warn(errorCode, message);
      }),
    ];
    return () => subs.forEach((s) => s.remove());
  }, [onDone]);
}

在旧架构下,事件通过 NativeEventEmitter 传递,参阅事件。

4. 或者不用界面 ​

如果已经知道要裁剪的范围,可以不显示界面直接裁剪:

ts
import { trim } from 'react-native-video-trim';

const { outputPath, duration } = await trim(uri, {
  startTime: 5_000,
  endTime: 25_000,
});

5. 清理 ​

输出文件会一直保留在磁盘上,直到你主动删除:

ts
import { deleteFile } from 'react-native-video-trim';

await deleteFile(outputPath);

接下来 ​

基于 MIT 许可证发布。