Skip to content

Xử lý lỗi ​

Tùy API, lỗi sẽ được báo về theo một trong ba cách.

Lỗi của trình chỉnh sửa: sự kiện onError ​

Trình chỉnh sửa phát onError kèm message để người đọc và errorCode để code xử lý:

ts
import VideoTrim, { type ErrorCode } from 'react-native-video-trim';

VideoTrim.onError(({ message, errorCode }) => {
  switch (errorCode as ErrorCode) {
    case 'FAIL_TO_LOAD_MEDIA':
      showToast('Không thể mở tệp này.');
      break;
    case 'NO_PHOTO_PERMISSION':
      showToast('Hãy cho phép truy cập ảnh để lưu video.');
      break;
    case 'HARDWARE_ENCODER_FAILED':
      reportToCrashlytics(message);
      break;
    default:
      console.warn(errorCode, message);
  }
});

Mã lỗi ​

ErrorCode liệt kê các mã lỗi mà phía native có thể gửi về. Không phải mã nào cũng có trên cả hai nền tảng, và sau này có thể có thêm mã mới, nên hãy luôn giữ nhánh default.

Mã lỗiNền tảngÝ nghĩa
FAIL_TO_LOAD_MEDIAiOS, AndroidKhông thể mở tệp hoặc URL.
TRIMMING_FAILEDiOS, AndroidFFmpeg gặp lỗi khi tạo tệp đầu ra.
HARDWARE_ENCODER_FAILEDiOS, AndroidLog FFmpeg cho thấy bộ mã hóa video không khởi tạo được. Trên Android, mã này chỉ được báo sau khi đã thử hết các bộ mã hóa dự phòng. Xem Cơ chế dự phòng bộ mã hóa trên Android.
OUTPUT_FORMAT_INCOMPATIBLEiOSContainer và codec của tệp đầu ra không kết hợp được với nhau.
FAIL_TO_SAVE_TO_PHOTOiOS, AndroidLưu vào thư viện ảnh thất bại.
NO_PHOTO_PERMISSIONiOSQuyền truy cập thư viện ảnh bị từ chối.
FAIL_TO_SHAREiOSBảng chia sẻ gặp lỗi.
INVALID_FILE_PATHiOSĐường dẫn không hợp lệ. Đã khai báo nhưng hiện chưa được phát.
FAIL_TO_SAVE_TO_DOCUMENTSAndroidLưu qua trình chọn tài liệu thất bại.
FAIL_TO_GET_VIDEO_INFOAndroidKhông đọc được metadata của media.
FAIL_TO_INITIALIZE_AUDIO_PLAYERAndroidKhông khởi động được trình phát âm thanh.
UNKNOWNAndroidCác lỗi khác, ví dụ không có activity hiện tại.

Lỗi của headless API: Promise bị reject ​

Các headless API reject với một Error. Nếu lỗi đến từ FFmpeg, message chứa toàn bộ log FFmpeg, đúng thứ bạn cần đính kèm khi báo lỗi:

ts
try {
  await compress(videoUri, { quality: 'low' });
} catch (e) {
  const message = e instanceof Error ? e.message : String(e);
  console.warn(message.split('\n')[0]); // ví dụ: "Compression failed: rc 1"
  logger.debug(message); // toàn bộ output của FFmpeg
}

Tham số không hợp lệ: throw đồng bộ ​

deleteFile(), saveToPhoto(), saveToDocuments(), share(), merge() và mixAudio() kiểm tra tham số trước khi gọi xuống native và sẽ throw (chứ không reject) khi đường dẫn hoặc danh sách rỗng. Hãy tự kiểm tra trước, hoặc gọi và await chúng trong cùng một khối try:

ts
try {
  await share(outputPath); // throw đồng bộ nếu outputPath là ''
} catch (e) {
  // cả lỗi throw lẫn lỗi reject đều rơi vào đây
}

Khi không tải được media ​

Alert hiển thị khi không tải được media

Theo mặc định, trình chỉnh sửa hiển thị một alert khi không tải được media, và phát onError với FAIL_TO_LOAD_MEDIA. Bạn có thể đổi nội dung alert, hoặc tắt hẳn bằng alertOnFailToLoad: false và hiển thị UI của riêng mình:

ts
showEditor(videoUri, {
  alertOnFailToLoad: true,
  alertOnFailTitle: 'Rất tiếc!',
  alertOnFailMessage: 'Không thể tải video này.',
  alertOnFailCloseText: 'OK',
});

Tránh lỗi ​

  • Kiểm tra tệp bằng isValidFile() trước khi mở.
  • Dùng package FFmpegKit https cho tệp từ xa.
  • Xin quyền truy cập ảnh trước khi dùng saveToPhoto.
  • Truyền tệp cục bộ cho merge() và mixAudio().

Phát hành theo giấy phép MIT.