使用 C# 从静止图像创建 MJPEG 视频
Creating an MJPEG video from still images using C#
我正在尝试从 JPEG 图像创建游戏中时光倒流。我读到 M-JPEG 的结构相当简单,基本上只是大多数浏览器都可以播放的串联 JPEG 图像。
var result = new List<byte>();
var converter = new ImageConverter();
foreach (var file in Directory.GetFiles(srcFolder, "*.jpg", SearchOption.TopDirectoryOnly)) {
using (var image = Image.FromFile(file) as Bitmap) {
var bytes = converter.ConvertTo(image, typeof(byte[])) as byte[];
result.AddRange(bytes);
image.Dispose();
}
}
File.WriteAllBytes($"{destFolder}video.mjpeg", result.ToArray());
但是,它不起作用。任何浏览器都无法播放生成的视频。它可以在 VLC 中播放,显示正确的第一张图像,但在其十秒的持续时间内不会更改为任何后续图像。
有人可以说我做错了什么吗?另外,是否可以通过 headers 调整帧率?
更新:感谢建议,我让它在 VLC 中正常工作。仍然无法在浏览器中播放,但至少朝着正确的方向迈出了一步。
var result = new List<byte>();
var converter = new ImageConverter();
var header = "HTTP/1.1 200 OK\r\n" +
"Content-Type: multipart/x-mixed-replace; boundary=" +
"--boundary" +
"\r\n";
result.AddRange(Encoding.ASCII.GetBytes(header));
foreach (var file in Directory.GetFiles(srcFolder, "*.jpg", SearchOption.TopDirectoryOnly)) {
using (var image = Image.FromFile(file) as Bitmap) {
var bytes = converter.ConvertTo(image, typeof(byte[])) as byte[];
StringBuilder sb = new StringBuilder();
sb.AppendLine();
sb.AppendLine("--boundary");
sb.AppendLine("Content-Type: image/jpeg");
sb.AppendLine("Content-Length: " + image.Size.ToString());
sb.AppendLine();
result.AddRange(Encoding.ASCII.GetBytes(sb.ToString()));
result.AddRange(bytes);
result.AddRange(Encoding.ASCII.GetBytes("\r\n"));
image.Dispose();
}
}
File.WriteAllBytes($"{destFolder}hat.mjpeg", result.ToArray());
检查 Google,发现:
https://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server
这篇文章是关于流媒体的,但我相信它可能对您的项目有所帮助。有一个可下载的代码示例。
我正在尝试从 JPEG 图像创建游戏中时光倒流。我读到 M-JPEG 的结构相当简单,基本上只是大多数浏览器都可以播放的串联 JPEG 图像。
var result = new List<byte>();
var converter = new ImageConverter();
foreach (var file in Directory.GetFiles(srcFolder, "*.jpg", SearchOption.TopDirectoryOnly)) {
using (var image = Image.FromFile(file) as Bitmap) {
var bytes = converter.ConvertTo(image, typeof(byte[])) as byte[];
result.AddRange(bytes);
image.Dispose();
}
}
File.WriteAllBytes($"{destFolder}video.mjpeg", result.ToArray());
但是,它不起作用。任何浏览器都无法播放生成的视频。它可以在 VLC 中播放,显示正确的第一张图像,但在其十秒的持续时间内不会更改为任何后续图像。
有人可以说我做错了什么吗?另外,是否可以通过 headers 调整帧率?
更新:感谢建议,我让它在 VLC 中正常工作。仍然无法在浏览器中播放,但至少朝着正确的方向迈出了一步。
var result = new List<byte>();
var converter = new ImageConverter();
var header = "HTTP/1.1 200 OK\r\n" +
"Content-Type: multipart/x-mixed-replace; boundary=" +
"--boundary" +
"\r\n";
result.AddRange(Encoding.ASCII.GetBytes(header));
foreach (var file in Directory.GetFiles(srcFolder, "*.jpg", SearchOption.TopDirectoryOnly)) {
using (var image = Image.FromFile(file) as Bitmap) {
var bytes = converter.ConvertTo(image, typeof(byte[])) as byte[];
StringBuilder sb = new StringBuilder();
sb.AppendLine();
sb.AppendLine("--boundary");
sb.AppendLine("Content-Type: image/jpeg");
sb.AppendLine("Content-Length: " + image.Size.ToString());
sb.AppendLine();
result.AddRange(Encoding.ASCII.GetBytes(sb.ToString()));
result.AddRange(bytes);
result.AddRange(Encoding.ASCII.GetBytes("\r\n"));
image.Dispose();
}
}
File.WriteAllBytes($"{destFolder}hat.mjpeg", result.ToArray());
检查 Google,发现:
https://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server
这篇文章是关于流媒体的,但我相信它可能对您的项目有所帮助。有一个可下载的代码示例。