Zeratool player - Медиа плеер для Windows

Основные возможности:

  • Создание нескольких независимых друг от друга плееров в одном окне (даблклик по пустому месту главного окна). Каждый такой плеер имеет свой ряд настроек и может воспроизводить свой файл.
  • Возможность выбора аудио-/видео декодеров для каждого плеера из тех, что были захардкожены в исходный код.
  • Возможность вывода звука на любое устройство, найденное в системе (для каждого плеера выбирается отдельно).
  • Поддерживаемые форматы: AVI, MPG, MPEG, TS, MP4, MKV, WEBM. Можно и другие, но в текущей версии захардкожены только эти.

Комментарии к коду:

  • Ранние версии этого плеера (с большим функционалом, чем здесь) были написаны на Delphi очень давно и допиливались в течении нескольких лет. За это время плеер пережил несколько реинкарнаций. Но то была лютая непрезентабельная хрень, которая ни разу никуда не публиковалась.
  • Название плеера появилось в результате прикола и так и осталось. Поймут только те, кто знают этот прикол.
  • В текущем состоянии разработки я специально оставил некоторый говнокод, чтобы переписать его в следующих версиях.
  • Я попытался всё сделать так, чтобы попасть на обзор к Роману Сакутину :grin:

Обновление 0.1.1-alpha

  • Сохранение / загрузка позиции и размера окон
  • Сохранение / загрузка состояния видимости заголовка плеера

Обновление 0.2.0-alpha

  • Добавлен лог действий плеера
  • Возможность бесконечного повтора текущего трека
  • Исправлены некоторые ошибки

Обновление 0.2.1-alpha

  • Сохранение настройки режима графа DirectShow
  • Установлен режим графа “Ручной” по-умолчанию
  • Добавлена возможность перетаскивать ярлыки файлов на плеер (как оказалось, в предыдущих релизах я забыл это сделать :man_shrugging: )

Обновление 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 

Чот вы Гит/Гитхаб неправильно используете.

Это не гугло/яндекс-диск, не надо создавать папки для релизов. Просто менять текущие файлы и будет история изменений с диффом и т.д.

Для фиксации релизов использовать теги, Гитхаб их автоматически создает при создании релиза

image

Изменения надо загружать (commit + push) из локального клиента: либо консольный, либо один из кучи GUI (в IDE часто есть или GitKraken, SmartGit, оф. клиент гитхаба, …). Тогда всё намного удобнее, можно легко коммитить небольшие изменения, части файлов и т.д. В идеале надо коммитить часто: сделал какую-то небольшую штуку (сохранение позиции, …) — закоммитил. Тогда можно будет нормально смотреть историю, откатывать изменения.

Ну так, я ведь ничего не умею использовать правильно :man_shrugging:

Да, надо будет как-нибудь засесть и разобраться. Но тогда всё удалять придётся.

Если в FormSettings.OnFormCreate, то причина может быть только одна - отсутствие устройств вывода аудио. Видимо, wine не даёт получить их список. Эту ошибку я еще не предусмотрел.

Если вкратце, это такой чел с ютуба. Знаменит тем, что продаёт свои божественные курсы по C# и Unity и обозревает код Гоши Дударя.

Я вроде разобрался с коммитами. Как теперь эту тему удалить, чтобы я ее нормально переделать смог?

Зачем удалять, можно просто новую ссылку дать )

Первое сообщение и другие старые сообщения теперь можно редактировать.

Я бы, кстати, дал ссылку на /releases в первом, чтоб не надо было ее менять постоянно.

Итак, товарищи! Всё фигня, давай по-новой!
Я удалил старый проект и заново зарелизил версию 0.1.0, практически без изменений в старом коде.
Надеюсь, что в коммиты не попала никакая порнуха, на которой я тестировал этот плеер :grin:
Однако, один коммит всё-равно зафакапил, случайно сделав Merge.

В текущем релизе, я это, вроде как, пофиксил :man_shrugging: Проверяйте.
Теперь, если аудиовыходы не найдены, он просто должен пропускать рендеринг звука :thinking: И пустой комбобокс теребить не должен.

Надеюсь, всё что допилил вообще работает :grin: А то часто так бывает, что на моём компе работает, а у других - нет :man_shrugging:

Внимание! После обновления до версии 0.3.2-alpha (или новее) с более старых, необходимо сбросить настройки клавиатуры по-умолчанию!

Зачем месседжбокс при каждом сохранении настроек?)

А видео чот так и не воспроизводится ни в одном режиме, “ручной” вообще выдает исключение

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


Чтобы юзеру не казалось, что кнопка ничего не делает.

Дык вы же, наверное, его в линуксе запускаете :thinking: А там всякое может быть :man_shrugging: До тестов в линуксе я ещё не добрался.

Судя по ошибке, с пинами что-то не то. Попробуйте другую комбинацию фильтров.

А в логе что? Сделайте скриншот лога. Потом допилю кнопку сохранения лога.

Обычно она должна закрывать окно если всё ок.

Можно было просто делать его обычным текстовым полем как везде, толку тут от листбокса )
И еще он не непонятно зачем частично очищается при перезагрузке видео.



Если она сохраняет все настройки сразу, то да. А у меня на разных вкладках разные настройки и их можно сохранять отдельно.

Толк в том что в ListView все столбцы выровнены, а в текстовом поле всё будет плясать. Кроме того, в будущих версиях можно будет даблкликнуть на строчку с ошибкой и получить более подробную информацию.

Лог ведётся только для текущего файла. Если вы открываете новый файл (или перезагружаете текущий), то и лог очищается.
Только, почему-то, сообщение Graph build | ERROR_NOTHING_RENDERED выводится два раза :thinking: Надо это пофиксить :point_up:


По ошибкам.

Тут пишут, что ошибка -2146232828 означает COR_E_TARGETINVOCATION 0x80131604.
Я не знаю, как это связано с DirectShow :man_shrugging:

На Delphi был такой прикол, что некоторые фильтры несовместимы друг с другом. Но там оно тупо крашилось. Возможно, эта ошибка как-раз из-за несовместимости фильтров :man_shrugging:

А зачем?)
Я когда сохранял как раз думал, что оно везде сохранит.

Зато куча других проблем и лишняя сложность про добавление везде этих кодов ошибок. И даже длинный текст сообщения может не поместиться.
Когда просто текст, то можно легко добавить любую новую полезную инфу. Лог же нужен для отладки, а не чтоб красиво выглядеть. Когда нужно сделать много действие, чтоб добавить новую инфу в лог, то обычно будет лень этим заниматься.

Когда файл настроек общий, то не за чем. А у меня несколько конфиг-файлов. Изменил что-то одно - сохранил. Другое не теребится.
Альтернативный ответ: "я художник, я так вижу :kolobok: "

Куда везде? :thinking: ListView же один.

А в чем отличие от добавления в ListView? В ListView тоже легко добавляется ведь :man_shrugging:

Не понимаю, чем именно это сложнее добавления в TextBox? :thinking:

Ну в коде же надо следить, чтоб были эти коды ошибок, добавлять новые и т.д.

Тут не получится просто добавить длинное сообщение в каком угодно формате (переносы строк, …). Например, текст ошибки из какого-то API, стек трейс, сообщения исключений (иногда вложенные).

В лог пишется событие и код ошибки. Например, если какой-то фильтр не загрузился - пишем в лог и пропускаем этот фильтр. По-этому, одно и то же событие дважды произойти не может. Значит и следить не за чем :man_shrugging:

Ну мне это и не надо :man_shrugging: А если понадобится, то можно в Tag привязать какой-нибудь класс со всем этим. А по даблклику выдавать полную инфрормацию.
Для упрощения ещё можно ObjectListView взять.

Точнее, информация об использовании фильтра пишется в любом случае, но суть не меняется.