У меня 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
со звуком или без него.