public async Task ConversionStreamTest() { var path = Res.GetPath(Res.Video_Mp4); var opath = "out-test-v-2.mp4"; try { using var reader = new VideoReader(path); await reader.LoadMetadataAsync(); var encoder = new H264Encoder { Format = "flv" }; using (var filestream = File.Create(opath)) { using (var writer = new VideoWriter(filestream, reader.Metadata.Width, reader.Metadata.Height, reader.Metadata.AvgFramerate, encoder.Create())) { writer.OpenWrite(); reader.Load(); await reader.CopyToAsync(writer); } } using var video = new VideoReader(opath); await video.LoadMetadataAsync(); Assert.True(video.Metadata.Codec == "h264"); Assert.True(video.Metadata.AvgFramerate == reader.Metadata.AvgFramerate); Assert.True(Math.Abs(video.Metadata.Duration - reader.Metadata.Duration) < 0.2); Assert.True(video.Metadata.Width == reader.Metadata.Width); Assert.True(video.Metadata.Height == reader.Metadata.Height); Assert.True(video.Metadata.BitDepth == reader.Metadata.BitDepth); Assert.True(video.Metadata.Streams.Length == 1); // only video } finally { if (File.Exists(opath)) { File.Delete(opath); } } }
public async Task ConversionTest2() { var path = Res.GetPath(Res.Video_Mp4); var opath = "out-test-v-2.webm"; try { var encoder = new VP9Encoder(); encoder.RowBasedMultithreading = true; encoder.SetCQP(31); using var reader = new VideoReader(path); reader.LoadMetadata(); reader.Load(); using (var writer = new VideoWriter(opath, reader.Metadata.Width, reader.Metadata.Height, reader.Metadata.AvgFramerate, encoder.Create())) { writer.OpenWrite(true); reader.CopyTo(writer); } using var video = new VideoReader(opath); await video.LoadMetadataAsync(); Assert.True(video.Metadata.Codec == "vp9"); Assert.True(video.Metadata.AvgFramerate == reader.Metadata.AvgFramerate); Assert.True(Math.Abs(video.Metadata.Duration - reader.Metadata.Duration) < 0.01); Assert.True(video.Metadata.Width == reader.Metadata.Width); Assert.True(video.Metadata.Height == reader.Metadata.Height); Assert.True(video.Metadata.Streams.Length == 1); // only video } finally { if (File.Exists(opath)) { File.Delete(opath); } } }
static void ReadWriteVideo(string input, string output) { var video = new VideoReader(input); video.LoadMetadataAsync().Wait(); video.Load(); using (var writer = new VideoWriter(File.Create(output), video.Metadata.Width, video.Metadata.Height, video.Metadata.AvgFramerate, new H264Encoder() { Format = "flv" }.Create())) { writer.OpenWrite(true); //video.CopyTo(writer); var frame = new VideoFrame(video.Metadata.Width, video.Metadata.Height); while (true) { // read next frame var f = video.NextFrame(frame); if (f == null) { break; } for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { var px = frame.GetPixels(i, j).Span; px[0] = 255; px[1] = 0; px[2] = 0; } } writer.WriteFrame(frame); } } }
static void ConvertVideo(string input, string output) { var encoder = new VP9Encoder(); encoder.RowBasedMultithreading = true; encoder.SetCQP(31); using (var reader = new VideoReader(input)) { reader.LoadMetadata(); reader.Load(); using (var writer = new VideoWriter(output, reader.Metadata.Width, reader.Metadata.Height, reader.Metadata.AvgFramerate, encoder.Create())) { writer.OpenWrite(true); reader.CopyTo(writer); } } }