public override void RecordFrame(RecordingSession session) { if (m_Inputs.Count != 1) { throw new Exception("Unsupported number of sources"); } var input = (BaseRenderTextureInput)m_Inputs[0]; var frame = input.outputRT; if (!m_ctx) { var webmSettings = m_Settings.m_WebmEncoderSettings; webmSettings.video = true; webmSettings.audio = false; webmSettings.videoWidth = frame.width; webmSettings.videoHeight = frame.height; if (m_Settings.m_AutoSelectBR) { webmSettings.videoTargetBitrate = (int)(((frame.width * frame.height / 1000.0) / 245 + 1.16) * (webmSettings.videoTargetFramerate / 48.0 + 0.5) * 1000000); } webmSettings.videoTargetFramerate = (int)Math.Ceiling(m_Settings.frameRate); m_ctx = fcAPI.fcWebMCreateContext(ref webmSettings); var path = m_Settings.fileNameGenerator.BuildAbsolutePath(session); m_stream = fcAPI.fcCreateFileStream(path); fcAPI.fcWebMAddOutputStream(m_ctx, m_stream); } fcAPI.fcLock(frame, TextureFormat.RGB24, (data, fmt) => { fcAPI.fcWebMAddVideoFramePixels(m_ctx, data, fmt, session.recorderTime); }); }
public override void Initialize(object config, string outPath) { if (!fcAPI.fcWebMIsSupported()) { Debug.LogError("WebM encoder is not available on this platform."); return; } m_config = (fcAPI.fcWebMConfig)config; if (m_config.audio && m_config.audioEncoder == fcAPI.fcWebMAudioEncoder.Opus) { var sampleRate = AudioSettings.outputSampleRate; if (sampleRate != 8000 && sampleRate != 12000 && sampleRate != 16000 && sampleRate != 24000 && sampleRate != 48000) { Debug.LogError("Current output sample rate is " + sampleRate + ". It must be 8000, 12000, 16000, 24000 or 48000 to use Opus audio encoder. Fallback to Vorbis."); m_config.audioEncoder = fcAPI.fcWebMAudioEncoder.Vorbis; } } m_config.audioSampleRate = AudioSettings.outputSampleRate; m_config.audioNumChannels = fcAPI.fcGetNumAudioChannels(); m_ctx = fcAPI.fcWebMCreateContext(ref m_config); var path = outPath + ".webm"; var stream = fcAPI.fcCreateFileStream(path); fcAPI.fcWebMAddOutputStream(m_ctx, stream); stream.Release(); }