我有一个非常基本的视频录制项目,可以在 Swift 中完美运行,但是移植到 Xamarin 中的空白项目中的相同代码正在生成每隔几秒钟不断跳帧的视频。代码开始ViewDidLoad
并通过 a 停止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)
};
}
}
}