Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Video transcoding problem in IONIC with iOS 13.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() does not work on several real iPhone devices with iOS 13.0 +.

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

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

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**

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**
...

Plugins used are: VideoEditor,Camera

like image 593
Amin Nourian Avatar asked Mar 31 '26 05:03

Amin Nourian


1 Answers

as of 12/14/2020 this is fixed on version 5.0.1 of cordova-plugin-camera

"cordova-plugin-camera": "5.0.1",

like image 192
Nadhir Falta Avatar answered Apr 02 '26 17:04

Nadhir Falta