Длительность AVPlayerItem неверна, когда AVCaptureMovieFileOutput записывает видео и аудио - PullRequest
0 голосов
/ 07 марта 2019

У меня AVCaptureSession запущен предварительный просмотр.Я настраиваю видео и аудио AVCaptureDeviceInput для записи на один AVCaptureMovieFileOutput следующим образом:

private void ConfigureSession(AVCaptureSession session) {
    session.BeginConfiguration();

    // setup camera input
    var cameraDevice = AVCaptureDevice.GetDefaultDevice(AVCaptureDeviceType.BuiltInWideAngleCamera, AVMediaType.Video, AVCaptureDevicePosition.Back);
    cameraDevice = cameraDevice ?? AVCaptureDevice.GetDefaultDevice(AVMediaType.Video);

    var captureDeviceInput = AVCaptureDeviceInput.FromDevice(cameraDevice);

    if (session.CanAddInput(captureDeviceInput)) {
        session.AddInput(captureDeviceInput);
    }

    // setup mic input
    var microphoneDevice = AVCaptureDevice.GetDefaultDevice(AVMediaType.Audio);
    var microphoneInput = AVCaptureDeviceInput.FromDevice(microphoneDevice);

    if (session.CanAddInput(microphoneInput)) {
        session.AddInput(microphoneInput);
    }

    // setup single output
    var output = new AVCaptureMovieFileOutput();
    output.MaxRecordedDuration = new CMTime(5 * 600, 600);  // max of 5 seconds
    if (session.CanAddOutput(output)) {
        session.AddOutput(output);
    }

    session.CommitConfiguration();

}

На данный момент мой сеанс уже запущен.Как вы можете видеть, видео и аудио входы добавляются вместе с одним выходом.

Выход также имеет MaxRecordedDuration 5 секунд.Через 5 секунд записи output автоматически останавливается.Затем я загружаю полученный видеофайл в AVPlayerItem и добавляю его в AVPlayer для воспроизведения:

    private AVPlayer SetupPlayer(string videoFilePath) {
        var asset = AVAsset.FromUrl(NSUrl.FromFilename(videoFilePath));
        var playableKey = "playable";

        var playerItem = new AVPlayerItem(asset, new NSString[] { (NSString)playableKey, (NSString)"hasProtectedContent" });
        playerItem.AddObserver(this, "status", NSKeyValueObservingOptions.OldNew, IntPtr.Zero);

        var player = AVPlayer.FromPlayerItem(playerItem);

        return player;
    }

    public override void ObserveValue(NSString keyPath, NSObject ofObject, NSDictionary change, IntPtr context) {
        if (keyPath == "status") {
            PlayerItemStatusChanged(new NSObservedChange(change));
        } else {
            base.ObserveValue(keyPath, ofObject, change, context);
        }
    }

    private void PlayerItemStatusChanged(NSObservedChange change) {
        AVPlayerItemStatus status = (AVPlayerItemStatus)Convert.ToInt32(change.NewValue.ToString());

        switch (status) {
            case AVPlayerItemStatus.Unknown:
                break;
            case AVPlayerItemStatus.ReadyToPlay:
                Debug.WriteLine($"Ready to Play: Player Item Duration: {Player.CurrentItem.Duration}");
                break;
            case AVPlayerItemStatus.Failed:
                // TODO: show error
                break;
            default:
                break;
        }
    }

Когда меняется Status, мой наблюдатель получает удар, который выводится на консольDuration.Длительность здесь, однако, всегда выводит около 5.6 секунд вместо 5 секунд, как определено в выходных файлах фильма MaxRecordedDuration.

Когда я удаляю вход микрофона, продолжительность, выводимая AVPlayerItem становится 5.

Почему запись звука в дополнение к видео вызывает сдвиг продолжительности AVPlayerItem?Общая длительность, которую выводит объект вывода файла фильма, всегда равна 5 со звуком или без него.

...