【问题标题】:Xamarin iOS AVCaptureSession - Only Audio/No Video on iPhone 8Xamarin iOS AVCaptureSession - iPhone 8 上只有音频/没有视频
【发布时间】:2018-09-13 17:24:52
【问题描述】:

我们有一个使用 Xamarin Forms 构建的视频录制应用程序。对于 iOS 录制,我们有一个自定义渲染器,它执行以下操作:

        NSError error;

        var CaptureSession = new AVCaptureSession();
        CaptureSession.SessionPreset = AVCaptureSession.PresetMedium;

        var videoDevices = AVCaptureDevice.DevicesWithMediaType(AVMediaType.Video);
        var cameraPosition = AVCaptureDevicePosition.Front;
        var device = videoDevices.FirstOrDefault(d => d.Position == cameraPosition);
        var input = new AVCaptureDeviceInput(device, out error);
        CaptureSession.AddInput(input);

        var audioDevice = AVCaptureDevice.GetDefaultDevice(AVMediaType.Audio);
        var audioDeviceInput = AVCaptureDeviceInput.FromDevice(audioDevice, out error);
        CaptureSession.AddInput(audioDeviceInput);

        CaptureSession.StartRunning();

        // ...
        // ...

        var MovieFileOutput = new AVCaptureMovieFileOutput();

        CaptureSession.AddOutput(MovieFileOutput);
        var basePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        var outputFilePath = Path.Combine(basePath, Path.ChangeExtension("video", "mov"));
        MovieFileOutput.StartRecordingToOutputFile(NSUrl.FromFilename(outputFilePath), this);

        // ...
        // ...

        MovieFileOutput.StopRecording();

我们过去甚至只是将 .mov 文件重命名为 .mp4,它在所有浏览器上都能正常播放 - mac/pc 上的 chrome 和 safari。我知道这不是一个好主意,但它似乎奏效了。

这在 iPhone 8 之前一直可以正常工作。现在在 iPhone 8 上录制的任何视频在 Safari 中都可以正常工作,但在 Mac 或 pc 的 chrome 上它只是播放音频但没有视频

我知道苹果在最近的 iOS 版本中提供了一些新的视频/照片格式,但这应该会影响 iPhone 7 Plus(运行最新的 iOS 并在相机中启用“高效”设置)。

有什么好的方法可以将录制的视频直接编码为 mp4 视频,以免出现此类问题?

以上代码基于示例应用程序 - https://developer.xamarin.com/samples/monotouch/ios10/AVCam/

【问题讨论】:

  • 我搜索了但没有发现与您相同的问题,请向Bugzilla提交错误。
  • @Yashvit 我也面临类似的问题。你找到解决办法了吗?
  • @Yashvit 我看到了同样的问题。什么最终对你有用?
  • 我最终使用 AVExportSession 进行转换。我将粘贴一些代码作为答案,以便你们了解如何去做

标签: ios xamarin xamarin.ios avcapturesession


【解决方案1】:

以下解决方案对我有用。

NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey, nil];

[movieFileOutput setOutputSettings:outputSettings forConnection:[movieFileOutput connectionWithMediaType:AVMediaTypeVideo]];

【讨论】:

    【解决方案2】:

    在几个人似乎面临同样的问题时回答这个问题。

    我最终使用 AVExportSession 进行转换。这似乎是进行转换的最佳方式,尽管我没有找到很多关于如何在 Xamarin 中正确执行此操作的示例。

    请看下面我的代码的 sn-p:

        private void ExportToMP4()
        {
            var basePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            var inputFilePath = Path.Combine(basePath, "test.mov");
            var outputFilePath = Path.Combine(basePath, "test.mp4");
    
            var asset = AVAsset.FromUrl(NSUrl.FromFilename(inputFilePath));
    
            AVAssetExportSession export = new AVAssetExportSession(asset, AVAssetExportSession.PresetMediumQuality);
    
            export.OutputUrl = NSUrl.FromFilename(outputFilePath);
            export.OutputFileType = AVFileType.Mpeg4;
            export.ShouldOptimizeForNetworkUse = true;
    
            try
            {
                //Reference : https://forums.xamarin.com/discussion/62537/xamarin-ios-mov-to-mp4-conversion
                export.ExportAsynchronously(() =>
                {
                    if (export.Error != null)
                    {
                        System.Diagnostics.Debug.WriteLine(export.Error.LocalizedDescription);
                    }
                    else
                    {
                        InvokeOnMainThread(() =>
                        {
                            // Success! Do what needs to be done...
                        });
                    }
                });
    
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
            }
        }
    

    【讨论】:

      【解决方案3】:

      您可以直接指定用于输出的编解码器为 H.264,避免需要以一种格式录制然后转换为另一种格式:

      var videoOutput = new AVCaptureMovieFileOutput();
      var outputSettings = new NSDictionary(AVVideo.CodecKey, AVVideo.CodecH264);
      
      videoOutput.SetOutputSettings(outputSettings, videoOutput.Connections[0]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2012-03-04
        • 2014-11-26
        • 1970-01-01
        • 2011-12-28
        相关资源
        最近更新 更多