Страница 1 из 1

VideoPlayer получить текущий кадр

СообщениеДобавлено: 25 апр 2017, 14:06
LemanRass
Здравствуйте.
Стоит задача по мере воспроизведения видео получать каждый кадр в виде byte[] buffer.
Для упрощения я решил для начала научиться хотя бы получать каждый кадр в виде Texture2D но столкнувшись с трудностями конвертации Texture в Texture2D (var texture = frame as Texture2D; не работает. Судя по всему там есть нюансы но с ними разберусь потом) в итоге решил получать кадр хотя бы в виде Texture.
Так вот, мне нужен конкретный кадр во время нажатия к примеру кнопки на клавиатуре в отдельном окошке.
Для себя я выбрал RawImage из UI для отображения последнего сохраненного кадра. Вот так в итоге выглядит сцена:
Скрытый текст:
Изображение


Пробовал реализовать задачу так:
Скрытый текст:
Изображение


И так:
Скрытый текст:
Изображение


И даже так:
Скрытый текст:
Изображение
\

Все чего я смог добиться это либо оно вообще не работает, либо при единичном нажатии оно воспроизводит все кадры из ролика вместо сохранения конкрентного.

Re: VideoPlayer получить текущий кадр

СообщениеДобавлено: 25 апр 2017, 14:16
DbIMok
VideoPlayer.renderMode установлен в Video.VideoTarget.APIOnly?

Re: VideoPlayer получить текущий кадр

СообщениеДобавлено: 25 апр 2017, 14:48
LemanRass
Нет. Но и с ним не работает. Более того, с ним даже видео в основном окне не работает. Вернее работает только звук без картинки.

Re: VideoPlayer получить текущий кадр

СообщениеДобавлено: 25 апр 2017, 15:33
DbIMok
LemanRass писал(а):без картинки

судя по справке так и должно быть. вот примерчик https://goo.gl/WTmrc6
Синтаксис:
Используется csharp
        private string url = @"https://upload.wikimedia.org/wikipedia/commons/transcoded/c/c5/I-15bis.ogv/I-15bis.ogv.240p.webm";
        private VideoPlayer vp;
        public RenderTexture rt;

        void Start () {
                vp = gameObject.AddComponent<VideoPlayer>();
                vp.renderMode = VideoRenderMode.RenderTexture;
                vp.targetTexture = rt;
                vp.url = url;
                vp.Play();
        }
       
        void Update () {
                if (Input.GetKey(KeyCode.LeftShift) && Input.GetKeyDown(KeyCode.S)) {
                        SaveToJPG();
                }
        }

        void SaveToJPG() {
                RenderTexture currentActiveRT = RenderTexture.active;
                RenderTexture.active = rt;
                Texture2D tex = new Texture2D(rt.width, rt.height);
                tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
                RenderTexture.active = currentActiveRT;
                byte[] bytes = tex.EncodeToJPG();
                File.WriteAllBytes(string.Format("{0}/test.jpg", Application.dataPath.Replace("/Assets", "/")), bytes);
        }

Re: VideoPlayer получить текущий кадр

СообщениеДобавлено: 26 апр 2017, 13:01
LemanRass
Большое спасибо.

Пришлось немного по потеть. Не понимал почему на диск нормально сохраняет а в RawImage вставляет только серый полупрозрачный фон.
Вспомнил что после манипуляций с пикселями текстур следует вызывать Apply() метод и теперь все ок.