Swift で完全に機能していた非常に基本的なビデオ録画プロジェクトがありますが、Xamarin の空のプロジェクトに移植された同じコードが、数秒ごとに常にフレームをスキップするビデオを生成しています。コードは で始まり、 a でViewDidLoad
停止しUIButton
ます。以下の記録コードは次のとおりです。
RPScreenRecorder rp = RPScreenRecorder.SharedRecorder;
AVAssetWriter assetWriter;
AVAssetWriterInput videoInput;
public override void ViewDidLoad()
{
base.ViewDidLoad();
StartScreenRecording();
}
public void StartScreenRecording()
{
VideoSettings videoSettings = new VideoSettings();
NSError wError;
assetWriter = new AVAssetWriter(videoSettings.OutputUrl, AVFileType.AppleM4A, out wError);
videoInput = new AVAssetWriterInput(AVMediaType.Video, videoSettings.OutputSettings);
videoInput.ExpectsMediaDataInRealTime = true;
assetWriter.AddInput(videoInput);
if (rp.Available)
{
rp.StartCaptureAsync((buffer, sampleType, error) =>
{
if (buffer.DataIsReady)
{
if (assetWriter.Status == AVAssetWriterStatus.Unknown)
{
assetWriter.StartWriting();
assetWriter.StartSessionAtSourceTime(buffer.PresentationTimeStamp);
}
if (assetWriter.Status == AVAssetWriterStatus.Failed)
{
return;
}
if (sampleType == RPSampleBufferType.Video)
{
if (videoInput.ReadyForMoreMediaData)
{
videoInput.AppendSampleBuffer(buffer);
}
}
}
});
}
}
public void StopRecording()
{
rp.StopCapture((error) => {
if (error == null)
{
assetWriter.FinishWriting(() => { });
}
});
}
VideoSettings ファイルは次のようになります。
public class VideoSettings
{
public string VideoFilename => "render";
public string VideoFilenameExt = "mp4";
public nfloat Width { get; set; }
public nfloat Height { get; set; }
public AVVideoCodec AvCodecKey => AVVideoCodec.H264;
public NSUrl OutputUrl
{
get
{
return GetFilename(VideoFilename,VideoFilenameExt);
}
}
private NSUrl GetFilename(string filename, string extension)
{
NSError error;
var docs = new NSFileManager().GetUrl(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User, null, true, out error).ToString() + filename + 1 + "." + extension;
if (error == null)
{
return new NSUrl(docs);
}
return null;
}
public AVVideoSettingsCompressed OutputSettings
{
get
{
return new AVVideoSettingsCompressed
{
Codec = AvCodecKey,
Width = Convert.ToInt32(UIScreen.MainScreen.Bounds.Size.Width),
Height = Convert.ToInt32(UIScreen.MainScreen.Bounds.Size.Height)
};
}
}
}