Skip to content

Instantly share code, notes, and snippets.

@ratozumbi
Created January 23, 2023 21:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ratozumbi/117fb1eb2bf7414c8b2f494c59b9135a to your computer and use it in GitHub Desktop.
Save ratozumbi/117fb1eb2bf7414c8b2f494c59b9135a to your computer and use it in GitHub Desktop.
Get thumbnail from video (Unity3D)
 //From: https://forum.unity.com/threads/skipping-to-video-frame-not-working-on-android.930021/#post-6173383
public void PrepareVideoForPlayback() {
Benchmark("Prepare Video Player for " + media.path);
videoPlayer.url = media.path;
videoPlayer.source = VideoSource.Url;
videoPlayer.renderMode = VideoRenderMode.APIOnly;
videoPlayer.prepareCompleted += OnVideoPrepareCompleted;
videoPlayer.Prepare();
}
 
void OnVideoPrepareCompleted(VideoPlayer source) {
Benchmark("Video Player prepared");
videoPlayer.prepareCompleted -= OnVideoPrepareCompleted;
videoPlayer.sendFrameReadyEvents = true;
videoPlayer.seekCompleted += OnVideoSeekCompleted;
var middleFrame = (int) (videoPlayer.frameCount / 2);
if (middleFrame > 0) videoPlayer.frame = middleFrame;
}
 
void OnVideoSeekCompleted(VideoPlayer source) {
Benchmark("Video seek completed");
videoPlayer.seekCompleted -= OnVideoSeekCompleted;
videoPlayer.frameReady += OnVideoPreviewFrameReady;
videoPlayer.SetDirectAudioMute(trackIndex: 0, mute: true);
videoPlayer.Play();
}
 
void OnVideoPreviewFrameReady(VideoPlayer source, long frameIdx) {
Benchmark($"Frame {frameIdx} ready");
videoPlayer.frameReady -= OnVideoPreviewFrameReady;
videoPlayer.Pause();
ExtractVideoPreview(source);
videoPlayer.frame = 0;
videoPlayer.SetDirectAudioMute(trackIndex: 0, mute: false);
OnVideoPreviewTextureExtracted();
}
 
void ExtractVideoPreview(VideoPlayer source) {
Benchmark("Extracting preview texture");
RenderTexture renderTexture = source.texture as RenderTexture;
media.texture = new Texture2D(renderTexture.width, renderTexture.height);
RenderTexture.active = renderTexture;
media.texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
media.texture.Apply();
RenderTexture.active = null;
 
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment