【问题标题】:Xamarin C# Transcode .mov to .mp4 with AVAsset Native IOSXamarin C# 使用 AVAsset Native IOS 将 .mov 转码为 .mp4
【发布时间】:2021-06-30 14:33:13
【问题描述】:

问题:我们的跨平台应用程序(IOS 和 Android)无法在 Android 上播放源自 IOS 的视频。

解决方案:在上传之前,在客户端 IOS 应用程序上将 .mov 视频文件转码为 .mp4。

问题:无法在 IOS 上获取文件位置(字符串输入为空)。不确定我的本机代码/方法是否合理。

异常:错误域=AVFoundationErrorDomain Code=-11800“操作无法完成”

共享代码:

try
        {
            MediaPickResult pickresult = await MediaGallery.PickAsync(1, MediaFileType.Video);

            if (pickresult != null)
            {
                foreach (var video in pickresult.Files)
                {
                    string guid = Guid.NewGuid().ToString();
                    blobupload.BlobID = guid + ".mp4";
                    string inputfilename = video.NameWithoutExtension + "." + video.Extension;
                    string input = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), inputfilename);
                    string output = Path.Combine(AzureStorage.localpath, guid + ".mp4");

                    if (File.Exists(input))
                    {
                        await IVideoConverter.ConvertVideo(input, output);
                    }
                }
            }

原生IOS:

public async Task ConvertVideo(string inputpath, string outputpath)
    {
        //string OutputFilePath = Path.ChangeExtension(outputpath, "mp4");
        AVAsset asset = AVAsset.FromUrl(NSUrl.FromFilename(inputpath));
        AVAssetExportSession export = new AVAssetExportSession(asset, AVAssetExportSession.PresetPassthrough);

        
        export.OutputUrl = NSUrl.FromFilename(outputpath);
        export.OutputFileType = AVFileType.Mpeg4;
        export.ShouldOptimizeForNetworkUse = true;

        var results = export.DetermineCompatibleFileTypesAsync();
        try
        {
            export.ExportAsynchronously(() =>
            {
                if (export.Error != null)
                {
                    System.Diagnostics.Debug.WriteLine(export.Error.LocalizedDescription);
                }
            });
        }
        catch (Exception ex)
        {

            System.Diagnostics.Debug.WriteLine(ex);
        }

【问题讨论】:

  • “无法获取 IOS 上的文件位置” - 请描述具体问题,包括任何错误消息或异常等
  • 不知道如何获取IOS上的文件位置。在共享代码中,字符串输入为空,所以我知道那行代码不正确。 github.com/dimonovdd/Xamarin.MediaGallery/discussions/37
  • 您正在尝试从应用程序的个人文件夹中加载文件,这是错误的。我不相信您可以通过路径直接访问媒体库视频(我可能错了),但是您可以使用流将视频复制到本地文件夹,然后转换该本地副本。
  • 请移动您的评论回答我会标记它已解决。

标签: c# ios xamarin avasset avassetexportsession


【解决方案1】:

我建议

  1. 从 MediaFile 获取流
  2. 写入本地应用文件夹
  3. 将该本地副本的路径传递给ConvertVideo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2012-08-15
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多