Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C# Указанный исполняемый файл не является действительным приложением для этой операционной системы http://www.cyberforum.ru/csharp-net/thread1134149.html
//СКАЧИВАНИЕ BEGIN System.Net.WebClient webClient = new System.Net.WebClient(); Uri uri = new...
Сегментация изображения C#
Всем привет! Как мне разделить изображения (*.tiff) космофото на много сегментов например сегмент 20 пикселей и обработать каждый FFT (но ето уже другая тема)? Спасибо!
Приостановить выполнение одного приложения до окончания выполнения любого другого C#
Добрый вечер! Подскажите, что лучше использовать, чтобы приостановить выполнение одного приложения, до окончания выполнения любого другого? Можно с сылочками и примерами. Конкретная задача:...
C# TCP сервер, который принимает ссылки с браузера Создаю TCP сервер, который принимает ссылки с браузера. Если я загружаю по одной ссылке тогда он всё принимает, но когда открываю браузер (там закреплены 10-20 вкладок) сервер печатает пустые... http://www.cyberforum.ru/csharp-net/thread1133849.html
C# Hyper-v: назначить ВМ сетевой адаптер http://www.cyberforum.ru/csharp-net/thread1133822.html
Здравствуйте. У меня сложилась такая ситуация: Есть скрипт vbs для бэкапа ВМ: HyperV Backup Tool v0.7.3 (http://sysadmins.ru/topic247352.html). Я его обрабатываю в C#, для большей...
C# Проблемы с конструкцией async\await при использовании WPF или Windows Forms
Добрый день! Написал библиотечку, использующую, в том числе конструкции async-await. Всё работает, при компиляции в виде консольного приложения, выполняется на ура. Подключил библиотечку к...
C# Асинхронный сервер на UDP-сокетах
Хай. Я как-то писал асинх. сервер с использованием TCP-протокола и все получилось очень круто, потому что там есть понятие соединения, и когда очередной клиент подключается к серверу, то мы получаем...
C# Научить нейросеть переводить двоичные числа в десятиричные В общем. Задание :научить нейросеть переводить двоичные числа в десятиричные. С чего начинать вообще без понятия, как вообще устроить нейросеть? Подскажите, если знаете. Заранее спасибо. http://www.cyberforum.ru/csharp-net/thread1133412.html
C# Принятие ссылок и передача их серверу http://www.cyberforum.ru/csharp-net/thread1133321.html
Нужно создать socks5 клиент принимает данные потом их передаёт. Сервер их принимает и выводит все ссылки которые ему поступили. Когда одиночно открываешь ссылки в браузере клиент нормально их...
C# Открытие запароленного архива Имеется архив под паролем(пароль мне известен). Как можно его открыть программно? Т.е. как я понимаю нужно какие то параметры при открытии файла передавать вот только как? http://www.cyberforum.ru/csharp-net/thread1133304.html
Eliador
16 / 16 / 4
Регистрация: 18.05.2011
Сообщений: 83
0

Рендеринг видео потока используя OpenTK и LibVLC

01.04.2014, 08:18. Просмотров 3366. Ответов 5
Метки (Все метки)

Здравствуйте!
Требуется отрендерить на полигон видео. Решил использовать LibVLC, нашел пример для OpenGL:
http://www.gamedev.ru/articles/OpenGL_VLC_GLFW
Разница лишь в том, что надо это сделать на OpenTK, тобишь на C#. Есть врапер LibVLC.NET:
http://libvlcnet.codeplex.com/
Воспроизвести видео у меня получилось, это не составило проблем, но вот как перенаправить поток не на отдельное окно или контрол, а в память(как это сделано в примере с OpenGL) не получается, крашится при выходе из первого же колбэка(делегата), причем не с исключением, а с какой-то системной ошибкой, которую винда сама определить не может, все ищет решение. Было мнение, что первый колбэк должен вернуть именно null, но во врапере сигнатура делегата для него имеет IntPtr тип возвращаемого значения, который не может быть null, а IntPtr.Zero - это все-таки конкретное значение(0). Пробовал это решить, использую PInvoke и сам вручную подключал плюсовую dll, а метод libvlc_video_set_callbacks и колбэк Lock делал как unsafe и возвращал void*, но не помогло.

Сейчас у меня 3 версии того, в чем может быть проблема:
1. В примере по первой ссылке не правельно указаны параметры передаваемые в плеер. Т.е. перенаправление потока осуществляется не vmem командой, а вот какой я понять не могу, не могу найти хоть какуюто информацию об атрибутах запуска vlc. В свою очередь, команда --vout точно работает, т.к. при ее наличие дефолтное окно с видео потоком пропадает и остается только звук.
2. В Lock колбэке надо возврощать что-то конкретное(опять же в примере по первой ссылке возможна ошибка). Но что это должно быть конкретно я не пойму.
3. Что-то не то в последней сборке vlc библиотеки(а использую я именно ее).

Если 3 я еще попробую проверить то с первыми двумя пунктами я в тупике, да и не факт что проблема в этом, это только мои догадки.

В общем нужна помощь по этому вопросу, заранее благодарю.

Добавлено через 23 часа 34 минуты
Извините, что сразу же не приложил код.
Загрузка dll:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    static class LibVlc
    {
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr libvlc_new(int argc, string[] argv);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr libvlc_media_new_path(IntPtr p_instance, IntPtr psz_path);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr libvlc_media_player_new_from_media(IntPtr p_md);
        
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void libvlc_media_release(IntPtr p_md);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int libvlc_media_player_play(IntPtr p_mi);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void libvlc_media_player_stop(IntPtr p_mi);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void libvlc_media_player_release(IntPtr p_mi);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void libvlc_release(IntPtr p_instance);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void libvlc_video_set_callbacks(IntPtr mp, libvlc_video_lock_cb _lock, libvlc_video_unlock_cb unlock, libvlc_video_display_cb display, IntPtr opaque);
 
        public delegate IntPtr libvlc_video_lock_cb(IntPtr opaque, ref IntPtr planes);
        public delegate void libvlc_video_unlock_cb(IntPtr opaque, IntPtr picture, ref IntPtr planes);
        public delegate void libvlc_video_display_cb(IntPtr opaque, IntPtr picture);
 
        [DllImport("VLC\\libvlc.dll", CallingConvention = CallingConvention.Cdecl)]
        public unsafe static extern void libvlc_video_set_format(IntPtr mp, string chroma, uint width, uint height, uint pitch);
    }
Собственно, использование этой библиотеки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
argv = new string[9]{
                "--no-xlib",
                "-q",
                "--no-video-title-show",
                "--quiet",
                "--ignore-config",
                "--vout", "vmem",  // это самый основной ключ - рендер в память, а не в окошко плеера
                "-I", "dumy"
            };
            inst = LibVlc.libvlc_new(9, argv);
            m = LibVlc.m_libvlc_media_new_path(inst, "test2.avi");
            mp = LibVlc.libvlc_media_player_new_from_media(m);
            LibVlc.libvlc_media_release(m);
            LibVlc.libvlc_video_set_callbacks(mp, cbLock, cbUnlock, cbDisplay, IntPtr.Zero);
            LibVlc.libvlc_video_set_format(mp, "RV32", 1280, 720, 4 * 1280);
            LibVlc.libvlc_media_player_play(mp);
И конечно делегаты:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
IntPtr cbLock(IntPtr opaque, ref IntPtr planes)
        {
            Pixels = planes; //Pixels определена как глобальная переменная IntPtr
            
            return IntPtr.Zero;
        } //падает при выходе из этого колбэка
        
        void cbUnlock(IntPtr opaque, IntPtr picture, ref IntPtr planes)
        { 
        }
 
        void cbDisplay(IntPtr opaque, IntPtr picture)
        { 
        }
Есть еще вариант(наиболее вероятный), почему оно падает там. Возможно (вероятнее всего) я не правильно определяю формат буфера памяти, куда будут читаться кадры из потока. Это делается с помощью метода libvlc_video_set_format, но вроде бы я там все правильно определил:
RV32 - аналог RGBA8, то-есть каждый пиксель описывается 4-я байтами, а при ширине изображения 1280, размер одного кадра будет составлять 1280 * 4. Разрешение видео несколько раз пересматривал, 1280x720.
В чем проблема не пойму, может я все-таки не правильно формат буфера определяю?

Вернуться к обсуждению:
Рендеринг видео потока используя OpenTK и LibVLC
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2014, 08:18
Готовые ответы и решения:

Воспроизведение OGG через OpenTK (OpenTK.OpenAL) из ресурсов
Добрый вечер всем! Собственно, мой первый пост :) Имеется проблема с воспроизведением звуков OGG...

Проверка наличия rtsp-потока с IP-камеры libvlc
Здравствуйте. Пишу программу с возможностью показа видео с IP-камер. Использую libvlc. Процедуры...

Обработка и рендеринг видео. До 70.000р
Здравствуйте! Не могли бы вы, пожалуйста, посоветовать сборку компьютера для обработки и рендеринга...

Цель апгрейда - рендеринг аудио и видео, игры, стримминг
Привет, форумчане. На сегодняшний день передо мной стоит вопрос апгрейда железа компьютера. Что...

Acer5742g при нагрузках(рендеринг видео, игры) перестаёт заряжаться
Добрый день, столкнулся с такой проблемой: при сильных нагрузках на ноутбук Acer5742g: рендеринг,...

5
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru