1

デバイスから GetAudio への MvvmCross 用のプラグインを開発しています。しかし、Touch の実装でエラーが発生します。私はすでにここここ、そしてここを見てきました。

しかし、私の問題は何も解決しませんでした。

さて、これまでのところ私は持っています:

        var audioDelegate = new AudioDelegate();
        audioDelegate.AudioAvailable = ProcessAudio;
        mediaPicker = new MPMediaPickerController(); 
        mediaPicker.Delegate = audioDelegate;
        mediaPicker.AllowsPickingMultipleItems = false;
        modalHost.PresentModalViewController (mediaPicker, true);

オーディオからピッカーを開始するには、AudioDelegate は次のとおりです。

    private class AudioDelegate : MPMediaPickerControllerDelegate
    {
        public EventHandler<MvxAudioRecorderEventArgs> AudioAvailable;

        public override void MediaItemsPicked (MPMediaPickerController sender, MPMediaItemCollection mediaItemCollection)
        {
            if (mediaItemCollection.Count < 1) 
            {
                return;
            }
            MvxAudioRecorderEventArgs eventArg = new MvxAudioRecorderEventArgs (mediaItemCollection.Items [0].AssetURL);
            AudioAvailable (this, eventArg);
        }
    }

そして ProcessAudio で:

    private void ProcessMedia(object sender, UIImagePickerMediaPickedEventArgs e)
    {
        var assetURL = e.MediaUrl;
        NSDictionary dictionary = null;
        var assetExtension = e.MediaUrl.Path.Split ('.') [1];

        var songAsset = new AVUrlAsset (assetURL, dictionary);
        var exporter = new AVAssetExportSession (songAsset, AVAssetExportSession.PresetPassthrough.ToString ());
        exporter.OutputFileType = (assetExtension == "mp3") ? "com.apple.quicktime-movie" : AVFileType.AppleM4A;
        var manager = new NSFileManager ();

        var count = 0;
        string filePath = null;
        do 
        {
            var extension = "mov";//( NSString *)UTTypeCopyPreferredTagWithClass(( CFStringRef)AVFileTypeQuickTimeMovie, kUTTagClassFilenameExtension);
            var fileNameNoExtension = "AUD_" + Guid.NewGuid ().ToString ();
            var fileName = string.Format ("{0}({1})", fileNameNoExtension, count);
            filePath = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) + "/";
            filePath = filePath + fileName + "." + extension;
            count++;

        } while (manager.FileExists (filePath));

        var outputURL = new NSUrl (filePath);//should be something in objective C... => [NSURL fileURLWithPath:filePath];

        exporter.OutputUrl = outputURL;


        exporter.ExportAsynchronously ( () =>
            {
                var exportStatus = exporter.Status;
                switch (exportStatus) 
                {
                    case AVAssetExportSessionStatus.Unknown:
                    case AVAssetExportSessionStatus.Completed: 
                    {
                        //remove the .mov from file and make it available for callback mediaAvailable()...
                        break;
                    }
                    case AVAssetExportSessionStatus.Waiting:
                    case AVAssetExportSessionStatus.Cancelled:
                    case AVAssetExportSessionStatus.Exporting:
                    case AVAssetExportSessionStatus.Failed: 
                    default:
                    {
                        var exportError = exporter.Error;
                        if(assumeCancelled != null)
                        {
                            assumeCancelled();
                        }
                        break;
                    }
                }
            });


        mediaPicker.DismissViewController(true, () => { });
        modalHost.NativeModalViewControllerDisappearedOnItsOwn();
    }

しかし、それは常に Status.Failed エラーで発生します:

        LocalizedDescription: The operation could not be completed

        Description: Error Domain=AVFoundationErrorDomain Code=-11800 
        "The operation could not be completed" UserInfo=0x1476cce0 
        {NSLocalizedDescription=The operation could not be completed, 
        NSUnderlyingError=0x1585da90 "The operation couldn’t be completed.
        (OSStatus error -12780.)", NSLocalizedFailureReason=An unknown error
        occurred (-12780)}

誰でも私を助けることができますか?よろしくお願いします。

4

1 に答える 1

0

解決策を見つけました。私が思ったように、エラーはoutputURLファイルにありました。

次のように変更しました。

        var count = 0;
        string filePath = null;
        do 
        {
            var extension = "mp3.mov";//( NSString *)UTTypeCopyPreferredTagWithClass(( CFStringRef)AVFileTypeQuickTimeMovie, kUTTagClassFilenameExtension);
            var fileNameNoExtension = "AUD_" + Guid.NewGuid ().ToString ();
            var fileName = (count == 0) ? fileNameNoExtension : string.Format ("{0}({1})", fileNameNoExtension, count);
            filePath = NSBundle.MainBundle.BundlePath + "/../tmp/" + fileName; /* HERE WAS THE FIRST PROBLEM, USE NSBUNDLE... */
            filePath = filePath + fileName + "." + extension;
            count++;

        } while (manager.FileExists (filePath));
        var outputURL = NSUrl.FromFilename(filePath); /* HERE WAAS THE SECOND PROBLEM, CREATE IT WITH FROMFILENAME INSTEAD OF NEW... */

そして、エクスポートで、.mov 拡張子を削除するだけです...

        var withoutMOVPath = outputURL.Path.Remove(outputURL.Path.Length - 4);
        NSError error = null;
        manager.Move (outputURL.Path, withoutMOVPath, out error);

            if(error != null && assumeCancelled != null)
            {
                assumeCancelled();
                return;
            }

        var mediaStream = new FileStream (withoutMOVPath, FileMode.Open);
        mediaAvailable (mediaStream);
        break;
于 2014-06-18T16:14:18.683 に答える