网上演练贵港万达广场(人员密集)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
5.5 KiB

4 years ago
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
namespace UTJ.FrameCapturer
{
[Serializable]
public class MovieEncoderConfigs
{
public MovieEncoder.Type format = MovieEncoder.Type.WebM;
public fcAPI.fcPngConfig pngEncoderSettings = fcAPI.fcPngConfig.default_value;
public fcAPI.fcExrConfig exrEncoderSettings = fcAPI.fcExrConfig.default_value;
public fcAPI.fcGifConfig gifEncoderSettings = fcAPI.fcGifConfig.default_value;
public fcAPI.fcWebMConfig webmEncoderSettings = fcAPI.fcWebMConfig.default_value;
public fcAPI.fcMP4Config mp4EncoderSettings = fcAPI.fcMP4Config.default_value;
public MovieEncoderConfigs(MovieEncoder.Type t)
{
format = t;
}
public bool supportVideo
{
get {
return
format == MovieEncoder.Type.Png ||
format == MovieEncoder.Type.Exr ||
format == MovieEncoder.Type.Gif ||
format == MovieEncoder.Type.WebM ||
format == MovieEncoder.Type.MP4;
}
}
public bool supportAudio
{
get
{
return
format == MovieEncoder.Type.WebM ||
format == MovieEncoder.Type.MP4;
}
}
public bool captureVideo
{
get
{
switch (format)
{
case MovieEncoder.Type.Png: return true;
case MovieEncoder.Type.Exr: return true;
case MovieEncoder.Type.Gif: return true;
case MovieEncoder.Type.WebM: return webmEncoderSettings.video;
case MovieEncoder.Type.MP4: return webmEncoderSettings.video;
}
return false;
}
set
{
webmEncoderSettings.video =
mp4EncoderSettings.video = value;
}
}
public bool captureAudio
{
get
{
switch (format)
{
case MovieEncoder.Type.Png: return false;
case MovieEncoder.Type.Exr: return false;
case MovieEncoder.Type.Gif: return false;
case MovieEncoder.Type.WebM: return webmEncoderSettings.audio;
case MovieEncoder.Type.MP4: return webmEncoderSettings.audio;
}
return false;
}
set
{
webmEncoderSettings.audio =
mp4EncoderSettings.audio = value;
}
}
public void Setup(int w, int h, int ch = 4, int targetFrameRate = 60)
{
pngEncoderSettings.width =
exrEncoderSettings.width =
gifEncoderSettings.width =
webmEncoderSettings.videoWidth =
mp4EncoderSettings.videoWidth = w;
pngEncoderSettings.height =
exrEncoderSettings.height =
gifEncoderSettings.height =
webmEncoderSettings.videoHeight =
mp4EncoderSettings.videoHeight = h;
pngEncoderSettings.channels =
exrEncoderSettings.channels = ch;
webmEncoderSettings.videoTargetFramerate =
mp4EncoderSettings.videoTargetFramerate = targetFrameRate;
}
}
public abstract class MovieEncoder : EncoderBase
{
public enum Type
{
Png,
Exr,
Gif,
WebM,
MP4,
}
static public Type[] GetAvailableEncoderTypes()
{
var ret = new List<Type>();
if (fcAPI.fcPngIsSupported()) { ret.Add(Type.Png); }
if (fcAPI.fcExrIsSupported()) { ret.Add(Type.Exr); }
if (fcAPI.fcGifIsSupported()) { ret.Add(Type.Gif); }
if (fcAPI.fcWebMIsSupported()) { ret.Add(Type.WebM); }
if (fcAPI.fcMP4OSIsSupported()) { ret.Add(Type.MP4); }
return ret.ToArray();
}
public abstract Type type { get; }
// config: config struct (fcGifConfig, fcWebMConfig, etc)
public abstract void Initialize(object config, string outPath);
public abstract void AddVideoFrame(byte[] frame, fcAPI.fcPixelFormat format, double timestamp = -1.0);
public abstract void AddAudioSamples(float[] samples);
public static MovieEncoder Create(Type t)
{
switch (t)
{
case Type.Png: return new PngEncoder();
case Type.Exr: return new ExrEncoder();
case Type.Gif: return new GifEncoder();
case Type.WebM:return new WebMEncoder();
case Type.MP4: return new MP4Encoder();
}
return null;
}
public static MovieEncoder Create(MovieEncoderConfigs c, string path)
{
var ret = Create(c.format);
switch (c.format)
{
case Type.Png: ret.Initialize(c.pngEncoderSettings, path); break;
case Type.Exr: ret.Initialize(c.exrEncoderSettings, path); break;
case Type.Gif: ret.Initialize(c.gifEncoderSettings, path); break;
case Type.WebM:ret.Initialize(c.webmEncoderSettings,path); break;
case Type.MP4: ret.Initialize(c.mp4EncoderSettings, path); break;
}
return ret;
}
}
}