带有iOS 13.0的IONIC中的视频转码问题 [英] Video transcoding problem in IONIC with iOS 13.0

查看:671
本文介绍了带有iOS 13.0的IONIC中的视频转码问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有一个现有的IONIC App,并且自从iOS 13.0发布以来,我们遇到了视频转码的问题. 当从camera.getPicture(带有sourceType = PHOTOLIBRARY)读取文件路径,并传递给videoEditor.transcodeVideo()时,它将无限期地继续调用进度回调,其值为0.它不会引发任何错误,也不会调用完成回调.

We have an existing IONIC App and since iOS 13.0 has been released we ran into a problem with transcoding videos. When file path is read from camera.getPicture (with sourceType=PHOTOLIBRARY), and passed to videoEditor.transcodeVideo(), it indefinitely keeps calling the progress callback with value 0. It won’t throw any error and it won’t call the Completed callback.

videoEditor.transcodeVideo()在装有iOS 13.0 +的多个真实iPhone设备上无法使用.

videoEditor.transcodeVideo() does not work on several real iPhone devices with iOS 13.0 +.

我在iOS 13.0的模拟器上尝试了相同的代码,令人惊讶的是它起作用了.

I tried the same code on a simulator with iOS 13.0 and surprisingly it worked.

我尝试了传递到transcodeVideo()的不同文件URL(无论是规范化URL还是完整URL),都没有机会!

I tried different file URLs passed to the transcodeVideo() - whether normalized or full URL - no chance!

我尝试对从相机(而不是照片库-captureVideo()函数)拍摄的视频进行转码,并且效果很好.

I tried transcoding a video which is taken from the camera (not from the photo library - captureVideo() function) and it works perfectly.

openFromLibrary() { //DOES NOT WORK
  const optionsFiles: CameraOptions = {
    quality: 50,
    destinationType: this.camera.DestinationType.FILE_URI,
    mediaType: this.camera.MediaType.VIDEO,
    targetWidth: 450,
    targetHeight: 450,
    sourceType: this.camera.PictureSourceType.PHOTOLIBRARY
  } 
  this.camera.getPicture(optionsFiles).then((data) => {
    let model = {
      fullPath: data,
      name: data.substring(data.lastIndexOf('/') + 1)
    }
    //model.fullPath is something like:
    //file:///private/var/mobile/Containers/Data/PluginKitPlugin/DE8E75E9-BF8B-4990-8F01-3874169D65E0/tmp/trim.4F8792C3-D9EC-450D-9E05-2D96C1CF5AE5.MOV
    this.TranscodeVideo(model);
  }, (err) => {
    console.log(err) 
  })
}

captureVideo() { //WORKS
    let options: CaptureVideoOptions = { limit: 1, quality: 1 };
    this.mediaCapture.captureVideo(options).then((data: MediaFile[]) => {
      this.TranscodeVideo(data[0]);
    },
       (err: CaptureError) => console.error(err)
    );
  }

TranscodeVideo(data: any) {
  let fileUri = data.fullPath;
  let outputFileName = this.removeExtension(data.name) + new Date().getMilliseconds() + '_transcoded-output';
  console.log("fileUri: " + fileUri);
  console.log("outputFileName: " + outputFileName);
  this.videoEditor.transcodeVideo({
      fileUri: fileUri,
      outputFileName: outputFileName,
      outputFileType: this.videoEditor.OutputFileType.MPEG4,
      progress: (info: number) => {
        //This gets called indefinitely ... with info = 0
        console.log('progress' + info)
      }
    }).then(
        (fileUri: string) => {
          //This never gets called
          console.log('completed')
        }
      ).catch((error: any) =>  {
         //This never gets called
         alert(error)
      });

}

期望的结果是我从模拟器的输出中得到的:

The expected result is what I got from the output of a simulator:

**2019-10-01 13:41:34.518254-0700 MyApp[1120:13425] fileUri: file:///Users/admin/Library/Developer/CoreSimulator/Devices/6E600D79-C397-4B55-B776-DE036DBFCA7C/data/Containers/Data/PluginKitPlugin/5F323D37-2DE5-4440-BCC0-C07D91F7F77E/tmp/trim.2BB1FF35-883B-4CFE-8EC0-2482E4A09321.MOV**
**2019-10-01 13:41:34.518505-0700 MyApp[1120:13425] outputFileName: trim.2BB1FF35-883B-4CFE-8EC0-2482E4A09321501_transcoded-output**
**2019-10-01 13:41:34.642996-0700 MyApp[1120:13425] input videoWidth: 360.000000**
**2019-10-01 13:41:34.643182-0700 MyApp[1120:13425] input videoHeight: 480.000000**
**2019-10-01 13:41:34.643264-0700 MyApp[1120:13425] output newWidth: 360**
**2019-10-01 13:41:34.643323-0700 MyApp[1120:13425] output newHeight: 480**
**2019-10-01 13:41:34.643522-0700 MyApp[1120:13425] THREAD WARNING: ['VideoEditor'] took '124.734131' ms. Plugin should use a background thread.**
**2019-10-01 13:41:34.662540-0700 MyApp[1120:13538] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x6000033c4600> F8BB1C28-BAE8-11D6-9C31-00039315CD46**
**2019-10-01 13:41:34.667810-0700 MyApp[1120:13538] [ddagg]        AggregateDevice.mm:776   couldn't get default input device, ID = 0, err = 0!**
**2019-10-01 13:41:34.701108-0700 MyApp[1120:13425] progress0**
**2019-10-01 13:41:34.889640-0700 MyApp[1120:13530] Video export succeeded**
**2019-10-01 13:41:34.890443-0700 MyApp[1120:13425] progress100**
**2019-10-01 13:41:34.894357-0700 MyApp[1120:13425] completed**

但是我得到的是无限数量的进度= 0,这是我从装有iOS 13.0的iPhone设备上记录的内容:

But what I getis an indefinite number of progress = 0, here is what I logged from an iPhone device with iOS 13.0:

**2019-10-01 13:46:40.599042-0700 MyApp[458:25050] fileUri: file:///private/var/mobile/Containers/Data/PluginKitPlugin/DE8E75E9-BF8B-4990-8F01-3874169D65E0/tmp/trim.521777DB-3325-4E83-98F6-BEDF14EBDC9C.MOV**
**2019-10-01 13:46:40.599279-0700 MyApp[458:25050] outputFileName: trim.521777DB-3325-4E83-98F6-BEDF14EBDC9C594_transcoded-output**
**2019-10-01 13:46:40.617653-0700 MyApp[458:25050] input videoWidth: 360.000000**
**2019-10-01 13:46:40.617717-0700 MyApp[458:25050] input videoHeight: 480.000000**
**2019-10-01 13:46:40.617747-0700 MyApp[458:25050] output newWidth: 360**
**2019-10-01 13:46:40.617780-0700 MyApp[458:25050] output newHeight: 480**
**2019-10-01 13:46:40.617903-0700 MyApp[458:25050] THREAD WARNING: ['VideoEditor'] took '17.159912' ms. Plugin should use a background thread.**
**2019-10-01 13:46:40.624098-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:40.624256-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:41.633175-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:42.639211-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:43.642919-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:44.649573-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:45.653984-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:46.661094-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:47.665412-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:48.669655-0700 MyApp[458:25050] progress0**
**2019-10-01 13:46:49.674255-0700 MyApp[458:25050] progress0**
...

使用的插件为:VideoEditor,Camera

Plugins used are: VideoEditor,Camera

推荐答案

我找到了答案,它可能会对遇到类似问题的人有所帮助.问题不在于VideoEditor插件中的Transcode函数,而是因为在调用camera.getPicture()时Camera插件返回了错误的文件路径.

I found the answer and it may helps those who are running into a similar problem. The problem is not the Transcode function in VideoEditor plugin, but, it is because of the incorrect file path that the Camera plugin returns when calling camera.getPicture().

路径是这样的: 文件:///private/var/mobile/Containers/Data/PluginKitPlugin/DE8E75E9-BF8B-4990-8F01-3874169D65E0/tmp/trim.521777DB-3325-4E83-98F6-BEDF14EBDC9C.MOV

The path is something like this: file:///private/var/mobile/Containers/Data/PluginKitPlugin/DE8E75E9-BF8B-4990-8F01-3874169D65E0/tmp/trim.521777DB-3325-4E83-98F6-BEDF14EBDC9C.MOV

因此,对于那些迫不及待想要等待该插件的更新以支持iOS 13.0的用户,请使用以下解决方案: 在XCode中找到相机插件源文件-CDVCamera.m和

So for those who cannot wait for an update for this plugin to come for iOS 13.0, here is the solution: In XCode find the camera plugin source file - CDVCamera.m and

更改:

(CDVPluginResult*)resultForVideo:(NSDictionary*)info
{
  NSString* moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] absoluteString];
  return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:filePath];
}

收件人:

(CDVPluginResult*)resultForVideo:(NSDictionary*)info
{
  NSString* moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];

  NSArray* spliteArray = [moviePath componentsSeparatedByString: @"/"];
  NSString* lastString = [spliteArray lastObject];
  NSError *error;
  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
  NSString *filePath = [documentsDirectory stringByAppendingPathComponent:lastString];
  [fileManager copyItemAtPath:moviePath toPath:filePath error:&error];

  return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:filePath];
}

此更改将电影复制到App文档目录,以便我们以后可以使用它.

This change copies the movie to the App document directory so we can use it afterwards.

感谢GitHub上的 litiobat : 来源

Thanks to litiobat on GitHub: Source

这篇关于带有iOS 13.0的IONIC中的视频转码问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆