Создание нескольких независимых друг от друга плееров в одном окне (даблклик по пустому месту главного окна). Каждый такой плеер имеет свой ряд настроек и может воспроизводить свой файл.
Возможность выбора аудио-/видео декодеров для каждого плеера из тех, что были захардкожены в исходный код.
Возможность вывода звука на любое устройство, найденное в системе (для каждого плеера выбирается отдельно).
Поддерживаемые форматы: AVI, MPG, MPEG, TS, MP4, MKV, WEBM. Можно и другие, но в текущей версии захардкожены только эти.
Комментарии к коду:
Ранние версии этого плеера (с большим функционалом, чем здесь) были написаны на Delphi очень давно и допиливались в течении нескольких лет. За это время плеер пережил несколько реинкарнаций. Но то была лютая непрезентабельная хрень, которая ни разу никуда не публиковалась.
Название плеера появилось в результате прикола и так и осталось. Поймут только те, кто знают этот прикол.
В текущем состоянии разработки я специально оставил некоторый говнокод, чтобы переписать его в следующих версиях.
Я попытался всё сделать так, чтобы попасть на обзор к Роману Сакутину
Обновление 0.1.1-alpha
Сохранение / загрузка позиции и размера окон
Сохранение / загрузка состояния видимости заголовка плеера
Обновление 0.2.0-alpha
Добавлен лог действий плеера
Возможность бесконечного повтора текущего трека
Исправлены некоторые ошибки
Обновление 0.2.1-alpha
Сохранение настройки режима графа DirectShow
Установлен режим графа “Ручной” по-умолчанию
Добавлена возможность перетаскивать ярлыки файлов на плеер (как оказалось, в предыдущих релизах я забыл это сделать )
Обновление 0.2.2-alpha
Исправлено падение программы, если не удалось отрендерить видео, но удалось отрендерить аудио
Сохранение и загрузка настроек кодеков
Возможность добавления дополнительных кодеков путём ручного редактирования файла настроек
Обновление 0.3.0-alpha
Добавлена возможность настраивать клавиши управления
Исправлены некоторые ошибки
Обновление 0.3.1-alpha
Исправлено закрытие программы нажатием на красную кнопку
Обновление 0.3.2-alpha
Добавлена клавиша “Перемотать в начало”
Исправлена возможность назначить одну и ту же клавишу на разные действия
Падает при запуске, видимо какой-то комбобокс пустой
System.ArgumentOutOfRangeException: InvalidArgument=Value of '0' is not valid for 'SelectedIndex'.
Parameter name: value
Actual value was 0.
at System.Windows.Forms.ComboBox.set_SelectedIndex (System.Int32 value) [0x0006a] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at Zeratool_player.FormSettings.OnFormCreate () [0x00055] in <cb8daa383e114149a8cba899cf55e298>:0
at Zeratool_player.FormSettings..ctor () [0x00013] in <cb8daa383e114149a8cba899cf55e298>:0
Чот вы Гит/Гитхаб неправильно используете.
Это не гугло/яндекс-диск, не надо создавать папки для релизов. Просто менять текущие файлы и будет история изменений с диффом и т.д.
Для фиксации релизов использовать теги, Гитхаб их автоматически создает при создании релиза
Изменения надо загружать (commit + push) из локального клиента: либо консольный, либо один из кучи GUI (в IDE часто есть или GitKraken, SmartGit, оф. клиент гитхаба, …). Тогда всё намного удобнее, можно легко коммитить небольшие изменения, части файлов и т.д. В идеале надо коммитить часто: сделал какую-то небольшую штуку (сохранение позиции, …) — закоммитил. Тогда можно будет нормально смотреть историю, откатывать изменения.
Ну так, я ведь ничего не умею использовать правильно
Да, надо будет как-нибудь засесть и разобраться. Но тогда всё удалять придётся.
Если в FormSettings.OnFormCreate, то причина может быть только одна - отсутствие устройств вывода аудио. Видимо, wine не даёт получить их список. Эту ошибку я еще не предусмотрел.
Если вкратце, это такой чел с ютуба. Знаменит тем, что продаёт свои божественные курсы по C# и Unity и обозревает код Гоши Дударя.
Итак, товарищи! Всё фигня, давай по-новой!
Я удалил старый проект и заново зарелизил версию 0.1.0, практически без изменений в старом коде.
Надеюсь, что в коммиты не попала никакая порнуха, на которой я тестировал этот плеер
Однако, один коммит всё-равно зафакапил, случайно сделав Merge.
В текущем релизе, я это, вроде как, пофиксил Проверяйте.
Теперь, если аудиовыходы не найдены, он просто должен пропускать рендеринг звука И пустой комбобокс теребить не должен.
Зачем месседжбокс при каждом сохранении настроек?)
А видео чот так и не воспроизводится ни в одном режиме, “ручной” вообще выдает исключение
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object
at Zeratool_player_C_Sharp.DirectShowUtils.FindPin (DirectShowLib.IBaseFilter filter, System.Int32 pinId, DirectShowLib.PinDirection pinDirection, DirectShowLib.IPin& resultPin) [0x00018] in <a2d351e3713f40e5a0e56fbb1b760a0b>:0
at Zeratool_player_C_Sharp.ZeratoolPlayerEngine.BuildGraphManual () [0x00124] in <a2d351e3713f40e5a0e56fbb1b760a0b>:0
at Zeratool_player_C_Sharp.ZeratoolPlayerEngine.BuildGraph () [0x00253] in <a2d351e3713f40e5a0e56fbb1b760a0b>:0
at Zeratool_player_C_Sharp.ZeratoolPlayerEngine.Play () [0x0000a] in <a2d351e3713f40e5a0e56fbb1b760a0b>:0
at (wrapper remoting-invoke-with-check) Zeratool_player_C_Sharp.ZeratoolPlayerEngine.Play()
at Zeratool_player_C_Sharp.ZeratoolPlayerGui.Play () [0x0001f] in <a2d351e3713f40e5a0e56fbb1b760a0b>:0
at (wrapper remoting-invoke-with-check) Zeratool_player_C_Sharp.ZeratoolPlayerGui.Play()
at Zeratool_player_C_Sharp.FormSettings.btnRebuildGraph_Click (System.Object sender, System.EventArgs e) [0x00052] in <a2d351e3713f40e5a0e56fbb1b760a0b>:0
at System.Windows.Forms.Control.OnClick (System.EventArgs e) [0x0001f] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.Button.OnClick (System.EventArgs e) [0x00037] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.Button.OnMouseUp (System.Windows.Forms.MouseEventArgs mevent) [0x0009a] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.Control.WmMouseUp (System.Windows.Forms.Message& m, System.Windows.Forms.MouseButtons button, System.Int32 clicks) [0x001c3] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message& m) [0x005a0] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.ButtonBase.WndProc (System.Windows.Forms.Message& m) [0x0011f] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.Button.WndProc (System.Windows.Forms.Message& m) [0x00056] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.Control+ControlNativeWindow.OnMessage (System.Windows.Forms.Message& m) [0x00001] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.Control+ControlNativeWindow.WndProc (System.Windows.Forms.Message& m) [0x000b3] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
at System.Windows.Forms.NativeWindow.Callback (System.Windows.Forms.Message& m) [0x00025] in <2736a4f873604bfea9e5f3a0d64b37d6>:0
\n************** Loaded Assemblies **************\nmscorlib\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/4.5/mscorlib.dll\n----------------------------------------\nZeratool\n Assembly Version: 1.0.0.0\n Win32 Version: 1.0.0.0\n CodeBase: file:///Z:/home/alex/Downloads/Zeratool%20player%200.1.1-alpha/ZeratoolPlayer_0.3.2-alpha/Zeratool.exe\n----------------------------------------\nSystem.Windows.Forms\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll\n----------------------------------------\nSystem\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll\n----------------------------------------\nSystem.Drawing\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll\n----------------------------------------\nAccessibility\n Assembly Version: 4.0.0.0\n Win32 Version: \n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll\n----------------------------------------\nSystem.Configuration\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll\n----------------------------------------\nDirectShowLib\n Assembly Version: 2.1.0.0\n Win32 Version: 2.1.0\n CodeBase: file:///Z:/home/alex/Downloads/Zeratool%20player%200.1.1-alpha/ZeratoolPlayer_0.3.2-alpha/DirectShowLib.dll\n----------------------------------------\nNewtonsoft.Json\n Assembly Version: 13.0.0.0\n Win32 Version: 13.0.1.25517\n CodeBase: file:///Z:/home/alex/Downloads/Zeratool%20player%200.1.1-alpha/ZeratoolPlayer_0.3.2-alpha/Newtonsoft.Json.dll\n----------------------------------------\nSystem.Core\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll\n----------------------------------------\nSystem.Numerics\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll\n----------------------------------------\nSystem.Runtime.Serialization\n Assembly Version: 4.0.0.0\n Win32 Version: 4.6.57.0\n CodeBase: file:///C:/windows/mono/mono-2.0/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll\n----------------------------------------\n\n************** JIT Debugging **************\n
Можно было просто делать его обычным текстовым полем как везде, толку тут от листбокса )
И еще он не непонятно зачем частично очищается при перезагрузке видео.
Если она сохраняет все настройки сразу, то да. А у меня на разных вкладках разные настройки и их можно сохранять отдельно.
Толк в том что в ListView все столбцы выровнены, а в текстовом поле всё будет плясать. Кроме того, в будущих версиях можно будет даблкликнуть на строчку с ошибкой и получить более подробную информацию.
Лог ведётся только для текущего файла. Если вы открываете новый файл (или перезагружаете текущий), то и лог очищается.
Только, почему-то, сообщение Graph build | ERROR_NOTHING_RENDERED выводится два раза Надо это пофиксить
По ошибкам.
Тут пишут, что ошибка -2146232828 означает COR_E_TARGETINVOCATION 0x80131604.
Я не знаю, как это связано с DirectShow
На Delphi был такой прикол, что некоторые фильтры несовместимы друг с другом. Но там оно тупо крашилось. Возможно, эта ошибка как-раз из-за несовместимости фильтров
А зачем?)
Я когда сохранял как раз думал, что оно везде сохранит.
Зато куча других проблем и лишняя сложность про добавление везде этих кодов ошибок. И даже длинный текст сообщения может не поместиться.
Когда просто текст, то можно легко добавить любую новую полезную инфу. Лог же нужен для отладки, а не чтоб красиво выглядеть. Когда нужно сделать много действие, чтоб добавить новую инфу в лог, то обычно будет лень этим заниматься.
Когда файл настроек общий, то не за чем. А у меня несколько конфиг-файлов. Изменил что-то одно - сохранил. Другое не теребится.
Альтернативный ответ: "я художник, я так вижу "
Куда везде? ListView же один.
А в чем отличие от добавления в ListView? В ListView тоже легко добавляется ведь
Не понимаю, чем именно это сложнее добавления в TextBox?
Ну в коде же надо следить, чтоб были эти коды ошибок, добавлять новые и т.д.
Тут не получится просто добавить длинное сообщение в каком угодно формате (переносы строк, …). Например, текст ошибки из какого-то API, стек трейс, сообщения исключений (иногда вложенные).
В лог пишется событие и код ошибки. Например, если какой-то фильтр не загрузился - пишем в лог и пропускаем этот фильтр. По-этому, одно и то же событие дважды произойти не может. Значит и следить не за чем
Ну мне это и не надо А если понадобится, то можно в Tag привязать какой-нибудь класс со всем этим. А по даблклику выдавать полную инфрормацию.
Для упрощения ещё можно ObjectListView взять.