Xamarin iOS AVCaptureSession - 仅限iPhone 8上的音频/无视频

时间:2018-04-04 08:22:50

标签: ios xamarin xamarin.ios avcapturesession

我们有一个使用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& amp;苹果浏览器。我知道这不是一个好主意,但似乎有效。

iPhone 8 之前,这种情况一直很好。现在,iPhone 8上录制的任何视频都可以在Safari中正常运行,但是对于Mac或PC,它只是播放音频但没有视频

我知道苹果在最近的iOS版本中附带了一些新的视频/照片格式,但这应该会影响iPhone 7 Plus(运行最新的iOS和#34;高效率"在相机中启用设置)。

将录制的视频直接编码为mp4视频的好方法是什么?这样的问题不会发生?

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

3 个答案:

答案 0 :(得分:1)

以下解决方案为我工作。

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

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

答案 1 :(得分:0)

回答这个问题,因为几个人似乎都面临着同样的问题。

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

请参见以下代码片段:

    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);
        }
    }

答案 2 :(得分:0)

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

var videoOutput = new AVCaptureMovieFileOutput();
var outputSettings = new NSDictionary(AVVideo.CodecKey, AVVideo.CodecH264);

videoOutput.SetOutputSettings(outputSettings, videoOutput.Connections[0]);
相关问题