6

尝试使用 Shahen 的 react-native-video-processing :

下面是代码:

compressVideo(source) {
    const options = {
        width: 800,
        height: 800,
        bitrateMultiplier: 3,
        saveToCameraRoll: true, 
        saveWithCurrentDate: true, 
        removeAudio: true 
    };

    ProcessingManager.compress(source, options)
        .then(data => {
            console.log(data);
            this.setState({ base64String: data });
        })
        .catch(console.warn);
}

但它会在 Android 设备中出现错误。

{ [错误:压缩错误:失败。ffmpeg 版本 3.3.5 版权所有 (c) 2000-2017 FFmpeg 开发人员使用 gcc 4.8 (GCC) 配置构建:
compatible_brands: isommp42 creation_time : 2018-03-01T08:47:13.000000Z com.android.version: 7.0 Duration: 00:00:04.07, start: 0.000000, bitrate: 3366 kb/s Stream #0:0(eng): Video : h264 (avc1 / 0x31637661), yuv420p(tv, smpte170m/smpte170m/bt709), 640x480, 3091 kb/s, SAR 1:1 DAR 4:3, 29.88 fps, 30 tbr, 90k tbn, 180k tbc (默认) 元数据: 旋转
: 90 creation_time : 2018-03-01T08:47:13.000000Z
handler_name : VideoHandle Side data: displaymatrix: 旋转 -90.00 度 Stream #0:1(eng): Audio:aac (mp4a / 0x6134706D), 48000 Hz,立体声,fltp,256 kb/s(默认)元数据:
creation_time : 2018-03-01T08:47:13.000000Z handler_name : SoundHandleStream 映射: Stream #0:0-> #0:0 (h264 (native) -> h264 (libx264))按 [q] 停止,[?]寻求帮助错误重新初始化过滤器!无法将帧注入过滤器网络:处理流#0:0转换失败的解码数据时出现内存不足错误!] framesToPop:1,代码:'EUNSPECIFIED'} 03-01 15:40:05.658 29497 29772我 ReactNativeJS:4,{ 高度:640,宽度:480 } 03-01 15:40:05.757 29497 29772 W ReactNativeJS:{ [错误:压缩错误:失败。ffmpeg 版本 3.3.5 版权所有 (c) 2000-2017 FFmpeg 开发人员使用 gcc 4.8 (GCC) 配置构建:
compatible_brands: isommp42 creation_time : 2018-03-01T08:47:13.000000Z com.android.version: 7.0 Duration: 00:00:04.07, start: 0.000000, bitrate: 3366 kb/s Stream #0:0(eng): Video : h264 (avc1 / 0x31637661), yuv420p(tv, smpte170m/smpte170m/bt709), 640x480, 3091 kb/s, SAR 1:1 DAR 4:3, 29.88 fps, 30 tbr, 90k tbn, 180k tbc (默认) 元数据: 旋转
: 90 creation_time : 2018-03-01T08:47:13.000000Z
handler_name : VideoHandle Side data: displaymatrix: 旋转 -90.00 度 Stream #0:1(eng): Audio:aac (mp4a / 0x6134706D), 48000 Hz,立体声,fltp,256 kb/s(默认)元数据:
creation_time : 2018-03-01T08:47:13.000000Z handler_name : SoundHandleStream 映射: Stream #0:0-> #0:0 (h264 (native) -> h264 (libx264))按 [q] 停止,[?]寻求帮助错误重新初始化过滤器!无法将帧注入过滤器网络:Out of memoryError while processing the decoded data for stream #0:0Conversion failed!] framesToPop: 1, code: 'EUNSPECIFIED' }

此问题的任何解决方案或任何其他在上传前压缩视频的方法。

4

2 回答 2

2

尝试以下代码以成功压缩 react-native 中的视频。我的压缩结果 => 7.5mb 到 1.48mb。此命令需要完整的 gpl

import { Platform } from 'react-native';
import {RNFFmpeg} from "react-native-ffmpeg"
import RNFS from 'react-native-fs';

function processVideo(videoUrl, callback) {
  const finalVideo = `${RNFS.CachesDirectoryPath}/audioVideoFinal.mp4`;

  cacheResourcePath(videoUrl).then((rVideoUrl) => {
   const str_cmd = `-y -i ${rVideoUrl} -c:v libx264 -crf 28 -preset ultrafast  ${finalVideo}`;
   
    RNFFmpeg.execute(
      str_cmd,
    ).then((result) => {
      if (result === 0) {
        RNFS.unlink(rVideoUrl);

        callback({
          videoPath:
            Platform.OS === 'android' ? 'file://' + finalVideo : finalVideo,
        });
      }
    });
  });
};

async function cacheResourcePath(sourcePath) {
  const uriComponents = sourcePath.split('/');
  const fileNameAndExtension = uriComponents[uriComponents.length - 1].replaceAll(' ','');

  const destPath = `${RNFS.CachesDirectoryPath}/${fileNameAndExtension}`;

  await RNFS.copyFile(sourcePath, destPath);
  return destPath;
}

于 2021-04-20T11:14:14.457 回答
1

使用rn-fetch-blob for android 首先转换路径,因为您获得的 URI 在 android 的情况下是临时的,在目录中找不到,

const res = await RNFetchBlob.fs.stat(SOURCE_URI);
src = "file://" + res.path;

ProcessingManager.compress(src, options)
    .then(data => {
        console.log(data);
        this.setState({ base64String: data });
    })
    .catch(console.warn);

这将解决路径问题。

于 2021-04-20T10:49:43.253 回答