react-native-image-picker视频压缩实现:使用react-native-video-processing

react-native-image-picker视频压缩实现:使用react-native-video-processing

【免费下载链接】react-native-image-picker :sunrise_over_mountains: A React Native module that allows you to use native UI to select media from the device library or directly from the camera. 【免费下载链接】react-native-image-picker 项目地址: https://gitcode.com/gh_mirrors/reac/react-native-image-picker

在移动应用开发中,视频上传和分享是常见需求,但高分辨率视频往往体积过大,导致上传缓慢和用户流量消耗过多。本文将详细介绍如何结合react-native-image-picker与react-native-video-processing实现视频压缩功能,解决这一痛点。读完本文,你将掌握视频选择、压缩处理的完整流程,并能根据实际需求调整压缩参数。

视频选择基础配置

react-native-image-picker提供了基础的视频选择能力,通过配置选项可初步控制视频质量。在src/types.ts中定义了视频相关参数:

export interface OptionsCommon {
  mediaType: MediaType; // 可设置为'video'
  videoQuality?: AndroidVideoOptions | iOSVideoOptions; // 基础画质控制
  formatAsMp4?: boolean; // 是否强制MP4格式
}

示例应用example/src/App.tsx中展示了视频拍摄和选择的实现:

{
  title: 'Take Video',
  type: 'capture',
  options: {
    saveToPhotos: true,
    formatAsMp4: true, // 强制转为MP4便于后续处理
    mediaType: 'video',
    videoQuality: 'low' // 基础压缩选项
  }
}

基础压缩通过videoQuality参数实现,Android支持'low'/'high',iOS支持'low'/'medium'/'high',但这种压缩能力有限,无法满足自定义比特率、分辨率等高级需求。

视频压缩实现方案

压缩流程设计

使用react-native-video-processing实现高级压缩需以下步骤:

  1. 通过react-native-image-picker获取视频文件路径
  2. 调用视频压缩API处理文件
  3. 获取压缩后文件并上传或展示

mermaid

核心实现代码

安装依赖后,实现压缩功能:

import RNVideoProcessing from 'react-native-video-processing';

// 视频选择回调处理
const handleVideoSelect = (response) => {
  if (response.assets && response.assets[0]) {
    const videoUri = response.assets[0].uri;
    compressVideo(videoUri); // 调用压缩方法
  }
};

// 压缩实现
const compressVideo = async (sourceUri) => {
  try {
    // 获取原始视频信息
    const info = await RNVideoProcessing.getVideoInfo(sourceUri);
    
    // 配置压缩参数
    const compressedUri = await RNVideoProcessing.compress(
      sourceUri,
      {
        width: 720, // 目标宽度
        height: 1280, // 目标高度
        bitrateMultiplier: 0.5, // 比特率乘数
        saveToCameraRoll: true,
        minimumBitrate: 500000, // 最小比特率
        progress: (progress) => console.log('Compression progress:', progress)
      }
    );
    
    setResponse({...response, assets: [{...response.assets[0], uri: compressedUri}]});
  } catch (error) {
    console.error('Compression error:', error);
  }
};

压缩参数优化策略

根据不同场景调整压缩参数可平衡视频质量和文件大小:

参数作用建议值
width/height控制分辨率720p(720×1280)适合移动端
bitrateMultiplier比特率乘数0.3-0.7之间,越小文件越小
minimumBitrate最小比特率500kbps避免过度压缩

src/platforms/native.ts中可设置默认视频质量:

const DEFAULT_OPTIONS = {
  videoQuality: 'high', // 基础质量选择
  formatAsMp4: true // 统一格式便于处理
};

完整实现示例

结合视频选择与压缩的完整组件代码:

import React from 'react';
import {View, Button} from 'react-native';
import * as ImagePicker from 'react-native-image-picker';
import RNVideoProcessing from 'react-native-video-processing';

const VideoPickerWithCompression = () => {
  const launchCamera = () => {
    const options = {
      mediaType: 'video',
      formatAsMp4: true,
      videoQuality: 'high' // 先获取高质量视频再压缩
    };

    ImagePicker.launchCamera(options, (response) => {
      if (!response.didCancel && response.assets) {
        compressVideo(response.assets[0].uri);
      }
    });
  };

  const compressVideo = async (uri) => {
    try {
      const compressedUri = await RNVideoProcessing.compress(uri, {
        width: 720,
        height: 1280,
        bitrateMultiplier: 0.5
      });
      console.log('Compressed video:', compressedUri);
      // 这里可以上传压缩后的视频
    } catch (error) {
      console.error('Compression failed:', error);
    }
  };

  return (
    <View>
      <Button title="拍摄并压缩视频" onPress={launchCamera} />
    </View>
  );
};

export default VideoPickerWithCompression;

注意事项与兼容性

  1. 权限配置:

    • Android需在AndroidManifest.xml添加存储和相机权限
    • iOS需在Info.plist添加NSCameraUsageDescription和NSPhotoLibraryUsageDescription
  2. 格式兼容性: 通过设置formatAsMp4: true确保输出MP4格式,避免处理不同编码格式的问题

  3. 性能优化:

    • 压缩过程建议放在非UI线程
    • 长视频可分段压缩或显示进度提示

总结与进阶方向

本文介绍了如何使用react-native-image-picker结合react-native-video-processing实现视频压缩功能。基础压缩可通过配置videoQuality参数实现,高级压缩则需使用专业视频处理库。实际开发中可根据网络环境、设备性能动态调整压缩参数,在质量和大小间取得平衡。

进阶方向:

  • 实现自适应压缩(根据视频长度自动调整参数)
  • 添加视频裁剪、水印等高级功能
  • 结合ffmpeg实现更精细的编解码控制

通过合理配置和优化,可显著提升视频上传速度和用户体验,满足社交分享、内容创作等场景需求。

【免费下载链接】react-native-image-picker :sunrise_over_mountains: A React Native module that allows you to use native UI to select media from the device library or directly from the camera. 【免费下载链接】react-native-image-picker 项目地址: https://gitcode.com/gh_mirrors/reac/react-native-image-picker

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值