【问题标题】:pick video using ionic 3 native camera plugin使用 ionic 3 原生相机插件选择视频
【发布时间】:2018-08-20 19:48:07
【问题描述】:
this.camera.getPicture({
      quality: 50,
      destinationType: this.camera.DestinationType.DATA_URL,
      mediaType: this.camera.MediaType.VIDEO,
      sourceType: this.camera.PictureSourceType.PHOTOLIBRARY,
    }).then((videoData) => {

    console.log('video data', videoData);

我无法将视频数据发送到服务器。

我在这里苦苦挣扎的第一件事是destinationType如何影响返回的结果,因为无论我设置什么(DATA_URL或File_Uri),它总是返回这个结构/storage/emulated/0/DCIM/Camera/VID_20180312_210545.mp4的一些url。 (仅供参考:我目前正在android平台上进行测试)。我可以通过简单地将视频放入 video src 来预览视频,但我无法将此视频发送到服务器。

这是我用来从返回的/storage 类似 URL 中获取视频文件然后将视频发送到服务器的方法。

return this.file.resolveLocalFilesystemUrl(data).then((entry:FileEntry)=>{
      debugger;
      return new Promise((resolve, reject)=>{
        entry.file((file)=>{
          let fileReader = new FileReader();
          fileReader.onloadend = ()=>{
            let blob = new Blob([fileReader.result], {type:file.type});
            resolve({blob: blob, file: file});
          };
          fileReader.readAsArrayBuffer(file);
        })
      })
    })

传递给resolveLocalFilesystemUrl的数据参数是我之前提到的同一个url (/storage/0..)。

但这会引发错误代码 5 和错误消息 ENCODING_ERR

我不是故意在这里传递编码类型,因为那是用于图像文件的。

重要提示:如果我将“file://”添加到数据中,然后像 this.file.resolveLocalFilesystemUrl('file://'+data).then(()) 这样将其传递给 resolveLocalFilesystemUrl(),那么我就可以创建我已经创建的文件条目发送到服务器,服务器已成功保存视频。但我想使用更多适用于 Android 和 iOS 的跨平台方法

【问题讨论】:

  • 您对此有任何官方解决方案吗?我正在经历完全相同的问题。此外,如果您可以发布一些代码,很高兴看到它的上下文化。提前致谢。
  • 我还没有找到一个永久的解决方案,但我暂时使用了一些小技巧来解决这个问题,并且我正在使用相同的代码(有一些小的改动)张贴上面的问题。以下是一些更改:destinationType: this.camera.DestinationType.FILE_URI,
  • 此代码返回一个视频 blob,我将其附加到 formData,然后我将其发送到后端 readVideoFileasGeneral(data) { if(!data.includes('file://')) data = 'file://' + data; return this.file.resolveLocalFilesystemUrl(data).then((entry: FileEntry) => { console.log('file entry', entry); // debugger; return new Promise((resolve, reject) => { entry.file((file) => { let fileReader = new FileReader(); fileReader.onloadend = () => { let blob = new Blob([fileReader.result], {type: file.type});
  • resolve({blob: blob, file: file}); }; fileReader.readAsArrayBuffer(file); }); }) }).catch((error) => { // debugger; console.log('video file resolve error', error); // this.createNewFileEntry(data); });
  • 复制并粘贴到某个编辑器中以缩进它,看看你是否能理解它。

标签: ionic-framework ionic3 ionic-native


【解决方案1】:

使用 Android 时,您需要更正 URL。

当您从库中选择视频时,您应该使用 resolveNativePath。

您可以在此处找到更多文档:

https://ionicframework.com/docs/native/file-path/

【讨论】:

  • 我没有尝试过的原因是因为这只是Android,这个插件在iOS的情况下如何解析路径?
  • 使用 iOS 时不需要解析路径。您将需要检查是否在 android 上运行,然后更正路径。像这样的东西:this.platfrom.is("android").
  • 好的,我一定会试一试,但您能否详细说明一下为什么 android 返回这种类型的 URI(因为在某些情况下,它返回的 URI 中已经包含了 'file://' URI 以及在哪些情况下或版本的插件将 resolveNativePath 工作。基本上我想了解更多关于 URI 方案的信息,所以如果你能解释更多或将我重定向到一篇很棒的文章。
  • 从库中挑选照片/视频时,您只需要正确的路径。 (PictureSourceType === PHOTOLIBRARY)。如果您拍摄新照片或录制新视频,则无需更正路径。查看文档:developer.android.com/reference/java/io/File.html
  • 好吧,我尝试了文件路径插件,但它没有解析 url。像这样使用它 this.filePath.resolveNativePath(videoData).then(url =>{ console.log('resolved url', url); }); 其中 videoData 是 /storage/emulated/0/DCIM/Camera/VID_20180312_210545.mp4 但它无法解析路径并抛出此错误字典 {code: 0, message: "Unable to resolve filesystem path."}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2018-10-20
  • 2022-08-19
相关资源
最近更新 更多