https://github.com/slimenull/ffmpegvideorenderer
Video renderer based on FFmpeg. 基于 FFmpeg 的视频渲染器
https://github.com/slimenull/ffmpegvideorenderer
ffmpeg video-processing
Last synced: about 1 year ago
JSON representation
Video renderer based on FFmpeg. 基于 FFmpeg 的视频渲染器
- Host: GitHub
- URL: https://github.com/slimenull/ffmpegvideorenderer
- Owner: SlimeNull
- License: mit
- Created: 2024-06-05T01:36:14.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2024-06-26T07:07:03.000Z (about 2 years ago)
- Last Synced: 2025-03-26T23:43:00.311Z (over 1 year ago)
- Topics: ffmpeg, video-processing
- Language: C#
- Homepage:
- Size: 89.8 KB
- Stars: 10
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# FFmpegVideoRenderer
基于 FFmpeg 的视频剪辑渲染器. 支持多视频与音频轨道, 音频与视频的过渡. 在媒体上, 理论支持 ffmpeg 能够解码与编码的所有音频视频以及图片格式.
## 使用
- 克隆并引用此项目
- 使用, 调用提供的功能即可
## 功能
本库主要提供了两个功能, 一是高度封装的视频剪辑, 二是它下面的 MediaSource 封装, 用于从媒体文件中获取帧与采样.
### 视频剪辑
只需要提供一个 "配置信息", 然后把它传给渲染方法, 就可以完成整个渲染过程了! 下面是一个简单的拼合两个视频前几秒的示例:
```csharp
// 打开两个素材
using var video1 = File.OpenRead(@"E:\CloudMusic\MV\Goyo.mp4");
using var video2 = File.OpenRead(@"E:\CloudMusic\MV\春めく.mp4");
// 保存位置
using var output = File.Create("output.mp4");
// 声明项目
var project = new Project()
{
OutputWidth = 800,
OutputHeight = 600,
Resources =
{
new ProjectResource("1", video1),
new ProjectResource("2", video2),
},
VideoTracks =
{
new VideoTrack()
{
Children =
{
new VideoTrackItem()
{
ResourceId = "1",
Offset = TimeSpan.FromSeconds(0),
StartTime = TimeSpan.FromSeconds(0),
EndTime = TimeSpan.FromSeconds(6),
},
new VideoTrackItem()
{
ResourceId = "2",
Offset = TimeSpan.FromSeconds(4),
StartTime = TimeSpan.FromSeconds(0),
EndTime = TimeSpan.FromSeconds(30),
}
}
},
},
};
// 渲染
VideoRenderer.Render(project, output);
```
### 视频源
使用 MediaSource 类, 你可以轻松从媒体文件中获取帧数据或者采样. 下面是个示例, 它会保存 0-9 秒的十张图片到文件中:
```csharp
using var video1 = File.OpenRead(@"E:\CloudMusic\MV\Goyo.mp4");
using var mediaSource1 = MediaSource.Create(video1);
for (int i = 0; i < 10; i++)
{
var time = TimeSpan.FromSeconds(i);
var saveTo = File.Create($"output{i}.png");
if (mediaSource1.GetVideoFrameBitmap(time) is SKBitmap bitmap)
{
bitmap.Encode(saveTo, SKEncodedImageFormat.Png, 0);
}
}
```