如何使用 expo(文件系统)将视频转换为 base64

Posted

技术标签:

【中文标题】如何使用 expo(文件系统)将视频转换为 base64【英文标题】:How to convert a video into base64 using expo(Filesystem) 【发布时间】:2021-12-10 09:54:02 【问题描述】:

我正在尝试向 cloudinary 发送视频,我似乎有一些类似的问题,但没有人回答我的问题。如何使用“Filesystem.readAsStringAsync”转换我的视频,以便将其发送到 cloudinary。这是我的一些代码。

    let pickerResult = await ImagePicker.launchImageLibraryAsync(
    allowsEditing: true,
    aspect: [4, 3], 
    base64: true, 
    mediaTypes: ImagePicker.MediaTypeOptions.Videos, 
    );

    if (pickerResult.cancelled === true)  
    return; 
     

    const base64Img 
    =`data:video/mp4;base64,$FileSystem.readAsStringAsync(pickerResult.uriencoding: 
    'base64')`;

    let data = 
    "file": base64Img, 
    "upload_preset": "******",
      

     const r = await fetch(CLOUDINARY_URL,  
     body: data,
     method: 'POST',
     ) 
     const datal = await r.json()
     setVideo(datal.secure_url); ;

我知道这不是正确的使用方法,因为它只是不断返回一个空字符串或 null,如果您需要更多信息,请告诉我如何解决这个问题

【问题讨论】:

您能确保 CLOUDINARY_URL 变量设置正确吗?即 - https://api.cloudinary.com/v1_1/<cloud name>/<resource_type>/upload 根据this。通常,如果出现问题,Cloudinary 会以错误详细信息进行响应。 【参考方案1】:

base64字符串读取文件的方式不对。

按照以下方式进行。

let pickerResult = await ImagePicker.launchImageLibraryAsync(
  allowsEditing: true,
  aspect: [4, 3],
  base64: true,
  mediaTypes: ImagePicker.MediaTypeOptions.Videos,
);

if (pickerResult.cancelled === true) 
  return;


const fsRead = await FileSystem.readAsStringAsync(pickerResult.uri, 
  encoding: "base64",
);

const base64Img = `data:video/mp4;base64,$fsRead`;
// This looks like data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAADGUbW9vdgAAAGxtdmhkAAAAAAAAAAAAAA

let data = 
  file: base64Img,
  upload_preset: "******",
;

const r = await fetch(CLOUDINARY_URL, 
  body: data,
  method: "POST",
);

const datal = await r.json();
setVideo(datal.secure_url);

【讨论】:

感谢我在半路将其转换为 base64,但它还没有发送到 cloudinary 您是否收到任何错误,如果有,是什么错误?另外,您将 CLOUDINARY_URL 定义为什么?如果包含,请确保不要分享您的 api_secret。 不行,我只需要创建一个加载组件……因为 cloudinary 返回数据需要一点时间

以上是关于如何使用 expo(文件系统)将视频转换为 base64的主要内容,如果未能解决你的问题,请参考以下文章

React Native Expo - 文件系统 readAsStringAsync 字节分配失败(内存不足)

如何使用 React Native App 录制音频和视频(没有 Expo)

如何在 expo react native 中使用 sqlite 文件

如何通过gstreamer将pcap转换为带有视频和音频的avi文件?

如何在上传到 Firebase 存储之前压缩 Expo 中的视频?

如何将 H264 RTP 流从 PCAP 转换为可播放的视频文件