public override void StartCapture() { if (!_isRendererRecording) { AudioRenderer.Start(); _isRendererRecording = true; } FlushBuffer(); }
private IEnumerator recordCoroutine() { var videoAttr = new VideoTrackAttributes { frameRate = new MediaRational(FramesPerSecond), width = Tic80Config.WIDTH, height = Tic80Config.HEIGHT, includeAlpha = false }; var audioAttr = new AudioTrackAttributes { sampleRate = new MediaRational(SoundFreq), channelCount = 2, language = "en" }; int sampleFramesPerVideoFrame = audioAttr.channelCount * audioAttr.sampleRate.numerator / videoAttr.frameRate.numerator; var tex = View.Instance.GetScreenTexture(); var frames = RecordTime * FramesPerSecond; float deltaTime = (float)1 / FramesPerSecond; AudioRenderer.Start(); using (var encoder = new MediaEncoder(encodedFilePath, videoAttr, audioAttr)) using (var audioBuffer = new NativeArray <float> (sampleFramesPerVideoFrame, Allocator.Persistent)) { for (int i = 0; i < frames; ++i) { encoder.AddFrame(tex); AudioRenderer.Render(audioBuffer); encoder.AddSamples(audioBuffer); yield return(deltaTime); } } AudioRenderer.Stop(); Debug.Log("Video saved to: " + encodedFilePath); EditorUtility.RevealInFinder(encodedFilePath); }
public override void BeginRecording() { AudioRenderer.Start(); }
void InitSora() { DisposeSora(); sora = new Sora(); if (!MultiRecv) { sora.OnAddTrack = (trackId) => { Debug.LogFormat("OnAddTrack: trackId={0}", trackId); this.trackId = trackId; }; sora.OnRemoveTrack = (trackId) => { Debug.LogFormat("OnRemoveTrack: trackId={0}", trackId); this.trackId = 0; }; } else { sora.OnAddTrack = (trackId) => { Debug.LogFormat("OnAddTrack: trackId={0}", trackId); var obj = GameObject.Instantiate(baseContent, Vector3.zero, Quaternion.identity); obj.name = string.Format("track {0}", trackId); obj.transform.SetParent(scrollViewContent.transform); obj.SetActive(true); var image = obj.GetComponent <UnityEngine.UI.RawImage>(); image.texture = new Texture2D(320, 240, TextureFormat.RGBA32, false); tracks.Add(trackId, obj); }; sora.OnRemoveTrack = (trackId) => { Debug.LogFormat("OnRemoveTrack: trackId={0}", trackId); if (tracks.ContainsKey(trackId)) { GameObject.Destroy(tracks[trackId]); tracks.Remove(trackId); } }; } sora.OnNotify = (json) => { Debug.LogFormat("OnNotify: {0}", json); }; // これは別スレッドからやってくるので注意すること sora.OnHandleAudio = (buf, samples, channels) => { lock (audioBuffer) { audioBuffer.Enqueue(buf); audioBufferSamples += samples; } }; if (unityAudioOutput) { var audioClip = AudioClip.Create("AudioClip", 480000, 1, 48000, true, (data) => { lock (audioBuffer) { if (audioBufferSamples < data.Length) { for (int i = 0; i < data.Length; i++) { data[i] = 0.0f; } return; } var p = audioBuffer.Peek(); for (int i = 0; i < data.Length; i++) { data[i] = p[audioBufferPosition] / 32768.0f; ++audioBufferPosition; if (audioBufferPosition >= p.Length) { audioBuffer.Dequeue(); p = audioBuffer.Peek(); audioBufferPosition = 0; } } audioBufferSamples -= data.Length; } }); audioSourceOutput.clip = audioClip; audioSourceOutput.Play(); } if (!Recvonly) { AudioRenderer.Start(); audioSourceInput.Play(); } }