Для создания видеофайлов я сейчас создаю снимки экрана каждого кадра, а затем сшиваю их вместе, чтобы создать видео.
Версии пакета:
- .Net: 8.0
- FFMediaToolkit: 4.8.1
- Avalonia: 11.3.8
FFMediaToolkit.FFmpegException
HResult=0x80131500
Message=Failed to open video encoder. Error code: -542398533 : Generic error in an external library
Source=FFMediaToolkit
StackTrace:
at FFMediaToolkit.Helpers.ExceptionHandler.ThrowIfError(Int32 errorCode, String exceptionMessage)
at FFMediaToolkit.Encoding.Internal.EncoderFactory.CreateVideo(OutputContainer container, VideoEncoderSettings config)
at FFMediaToolkit.Encoding.Internal.OutputContainer.AddVideoStream(VideoEncoderSettings config)
at FFMediaToolkit.Encoding.MediaBuilder.WithVideo(VideoEncoderSettings settings)
at _2dAnimator.Views.MainView.RenderAnimation(String fileName, String exportPath, String exportFormat, Int32 frameRate) in C:\avalonia\2dAnimator\2dAnimator\Views\MainView.axaml.cs:line 247
at _2dAnimator.RenderOptionsWindow.RenderBtn_OnClick(Object sender, RoutedEventArgs e) in C:\avalonia\2dAnimator\2dAnimator\Views\RenderOptionsWindow.axaml.cs:line 62
at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
Мой код:
private void RenderAnimation(string fileName, string exportPath, string exportFormat, int frameRate)
{
if (fileName == null)
fileName = $"file_{DateTime.Now.Millisecond}";
if (exportPath == null)
exportPath = "C:\\Documents";
var width = MainCanvas.Bounds.Width;
var height = MainCanvas.Bounds.Height;
PixelSize pixelSize = new PixelSize((int)width, (int)height);
RenderTargetBitmap bitmap = new RenderTargetBitmap(pixelSize);
int counter = 0;
foreach (var frame in frames)
{
MainCanvas.Children.Clear();
MainCanvas.Children.Add(frame.currentLines);
bitmap.Render(MainCanvas);
bitmap.Save($"C:\\temp\\{counter}.png");
counter++;
}
var settings = new VideoEncoderSettings((int)width, (int)height, frameRate, VideoCodec.H264)
{
EncoderPreset = EncoderPreset.Fast,
CRF = 17
};
var file = MediaBuilder.CreateContainer($"{exportPath}/{fileName}.{exportFormat}").WithVideo(settings).Create();
for (int i = 0; i < frames.Count; i++)
{
using var bmp = SKBitmap.Decode($"C:\\temp\\{i}.png");
file.Video.AddFrame(new FFMediaToolkit.Graphics.ImageData(bmp.GetPixelSpan(), FFMediaToolkit.Graphics.ImagePixelFormat.Rgba32, bmp.Width, bmp.Height));
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... en-video-e
Мобильная версия