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 Copyright (c) 2000-2017 gcc 4.8 (GCC) 構成でビルドされた FFmpeg 開発者:
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 サイド データ: displaymatrix: -90.00 度の回転 ストリーム #0:1(eng): オーディオ:aac (mp4a / 0x6134706D), 48000 Hz,ステレオ、fltp、256 kb/s (デフォルト) メタデータ:
creation_time : 2018-03-01T08:47:13.000000Z handler_name : SoundHandleStream マッピング: ストリーム #0:0-> #0:0 (h264 (ネイティブ) -> h264 (libx264)) [q] を押して停止、[?]フィルターの再初期化中にエラーが発生しました!フィルター ネットワークにフレームを挿入できませんでした: ストリーム #0:0Conversion のデコードされたデータの処理中にメモリ不足のエラーが発生しました! I ReactNativeJS: 4, { 高さ: 640, 幅: 480 } 03-01 15:40:05.757 29497 29772 W ReactNativeJS: { [エラー: 圧縮エラー: 失敗しました。ffmpeg バージョン 3.3.5 Copyright (c) 2000-2017 gcc 4.8 (GCC) 構成でビルドされた FFmpeg 開発者:
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 サイド データ: displaymatrix: -90.00 度の回転 ストリーム #0:1(eng): オーディオ:aac (mp4a / 0x6134706D), 48000 Hz,ステレオ、fltp、256 kb/s (デフォルト) メタデータ:
creation_time : 2018-03-01T08:47:13.000000Z handler_name : SoundHandleStream マッピング: ストリーム #0:0-> #0:0 (h264 (ネイティブ) -> h264 (libx264)) [q] を押して停止、[?]フィルタの再初期化中に helpError が発生しました!フレームをフィルタ ネットワークに挿入できませんでした: ストリーム #0:0Conversion のデコード データの処理中にメモリ不足エラーが発生しました!] framesToPop: 1, code: 'EUNSPECIFIED' }

この問題の解決策、またはアップロードする前にビデオを圧縮するその他の方法。

4

2 に答える 2

1

Android の場合はrn-fetch-blobを使用して最初にパスを変換します。これは、取得する 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 に答える