Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[wlx/wdx] TCMediaInfo
Goto page Previous  1, 2, 3 ... 57, 58, 59 ... 66, 67, 68  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
AkulaBig



Joined: 03 Dec 2008
Posts: 370

Post (Separately) Posted: Mon Nov 04, 2024 12:07    Post subject: Reply with quote

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

      <!-- General -->
      <column name="Duration">
         <unit name="hh:mm:ss" type="script">Output:=TimingFormat('%hh:%mm:%ss', Duration);</unit>
         <unit name="hh:mm:ss.fff" type="script">Output:=TimingFormat('%hh:%mm:%ss.%fff', Duration);</unit>
         // FIXES: Show Duration in second
         <unit name="sec" type="script">Output:=Round(Number(Duration)/1000);</unit>
         // FIXES: Show Duration in millisecond
         <unit name="msec">Duration</unit>
         // FIXES: Show Duration Custom
         <unit name="Custom" type="script">
         <![CDATA[
            Output:='';
            if (Duration <= 0) then Exit;
            if Not StrIsNumber(Duration) then Exit;
            Secs := Integer(Duration / 1000); //convert miliseconds to seconds
            Hours := Integer(Secs / 3600); //3600 seconds in an hour
            Mins := Integer((Secs - (Hours * 3600)) / 60); //60 secs per min
            Secs := Secs - ((Hours * 3600) + (Mins * 60)); //leftovers
            If (Hours < 10) then Hours := '0' + String(Hours);
            If (Mins < 10) then Mins := '0' + String(Mins);
            If (Secs < 10) then Secs := '0' + String(Secs);
            Output := StrFormat('%s:%s:%s', Hours, Mins, Secs))
         ]]>
         </unit>
      </column>

Этот вариант полностью соответствует отображению MediaInfo, что подтверждаю скрином. Дело в том, что многие при подсчете продолжительности расчет ведут от округленных секунд, что конечно неправильно. Даже K-Lite Codeck Pack считает неправильно. Что видно на скрине. Хотелось-бы увидеть эти изменения в плагине, для стандартных форматов продолжительности. Чтобы у всех были одинаковые данные. Еще нашел косячки в последнем TCMediaInfo.xml. Из-за чего не отображались год, наличие обложки и комменты аудио-файлов. Еще там кое-какие обновления. Опять-же, если сочтете нужным, включите эти изменения в новую версию плагина. https://www.dropbox.com/scl/fi/g17ie6raiopm67pngdcwc/TCMediaInfo.xml?rlkey=p6t0cy4cbrx7pqusk831dqx6l&dl=1
Я конечно и сам сейчас выложу на ру.борде эту информацию. Но очень-бы хотелось, чтобы это было единоообразно для всех.

На скрине первая колонка продолжительности мой кастом, вторая - ваша стандартная.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 786

Post (Separately) Posted: Mon Nov 04, 2024 12:43    Post subject: Reply with quote

AkulaBig
А в чем весь сыр-бор-то? Что последняя секунда не так округляется? Да и фиг с ней Laughing

Ну а если серьёзно, там же есть фреймы для уточнения, т.е. например Duration, hh:mm:ss.fff = 00:08:16.526

Или я что-то не понимаю?

 Hidden text
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 370

Post (Separately) Posted: Mon Nov 04, 2024 13:30    Post subject: Reply with quote

Orion9 wrote:
AkulaBig
А в чем весь сыр-бор-то? Что последняя секунда не так округляется? Да и фиг с ней Laughing

Не порядок, когда есть разночтение с MediaInfo, раз плагин ей пользуется.
Orion9 wrote:
AkulaBig
 Hidden text
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1554

Post (Separately) Posted: Mon Nov 04, 2024 17:27    Post subject: Reply with quote

AkulaBig wrote:
Дело в том, что многие при подсчете продолжительности расчет ведут от округленных секунд, что конечно неправильно.

Если вести не от округлённых, то получается, что в расчете тайминга мы просто отбрасываем миллисекунды. Что, собственно, и делалось в TimingFormat до всех сентябрьских модификаций (да, там все равно был косячок в округлении до десятых/сотых при наличии спецификаторов %f, но он не связан с округлением до целых секунд, в этом случае миллисекунды отбрасывались).

В вашем Custom эта строка просто обрезает полученное дробное число секунд до меньшего целого, никакого округления не производится:

Code:
Secs := Integer(Duration / 1000); //convert miliseconds to seconds


Что приводит вывод к старому варианту Smile

AkulaBig wrote:
Этот вариант полностью соответствует отображению MediaInfo, что подтверждаю скрином.

Разумеется, потому что MediaInfo при форматировании не округляет, а отбрасывает миллисекунды.

AkulaBig wrote:
Опять-же, если сочтете нужным, включите эти изменения в новую версию плагина.

Посмотрю, но не очень скоро, вижу там много чего.

AkulaBig wrote:
Не порядок, когда есть разночтение с MediaInfo, раз плагин ей пользуется.

А вот это как раз ни к чему не обязывает, поскольку MediaInfo используется только как источник сырых данных. То, что выводит GUI-версия - это уже отформатированные данные. Единственные данные, которые обязаны быть одинаковы - это полный тайминг вида 00:08:16.526, всё остальное зависит от метода расчета и предпочтений пользователя.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 370

Post (Separately) Posted: Mon Nov 04, 2024 18:17    Post subject: Reply with quote

Loopback wrote:
AkulaBig wrote:
Дело в том, что многие при подсчете продолжительности расчет ведут от округленных секунд, что конечно неправильно.

Code:
Secs := Integer(Duration / 1000); //convert miliseconds to seconds


Что приводит вывод к старому варианту Smile

Эта строка как раз у меня вопросов не вызывает. Понятно, что она является округлением до секунд по правилам математики. А вот при преобразовании в часы, минуты, секунды не надо округлять секунды, а потом от этого округления высчитывать продолжительность. То-есть обсуждать стоит только блок Custom.
Loopback wrote:

В вашем Custom эта строка просто обрезает полученное дробное число секунд до меньшего целого, никакого округления не производится:

Code:
Secs := Integer(Duration / 1000); //convert miliseconds to seconds


Это очень тонкий момент. К сожалению под рукой нет учителя математики, чтобы подтвердить правоту этого выражения. Похоже это соответствует правилам именно при преобразовании в часы, минуты, секунды. В любом случае MI работает именно по подобному алгоритму.
Loopback wrote:
Разумеется, потому что MediaInfo при форматировании не округляет, а отбрасывает миллисекунды.

Как я писал выше, видимо именно так должно происходить преобразование. Может у вас есть толковое словесное описание, как должно происходить преобразование? Я такого в инете не нашел. Я думаю тут причина в том, что есть разница между округлением и преобразованием. Ведь это не округление.
Loopback wrote:

Посмотрю, но не очень скоро, вижу там много чего.

Конечно оставьте это до появления свободного времени. Лично меня кастомное поле вполне устраивает. И вам я написал только для того, чтобы сделать отображение одинаковым для всех. А остальные изменения да, тоже хотелось-бы учесть. Я совершенно случайно заметил, что некоторые поля не отображаются. Посмотрел, у вас оказывается в последних версиях плагина очень изменился алгоритм xml, поэтому и вылез косяк. Я просто эти строки из старого xml взял. Кстати, остальные поля я не проверял. Только те, что заметил.
Loopback wrote:

То, что выводит GUI-версия - это уже отформатированные данные.

Дак в этом и дело, что мы не можем отследить алгоритм преобразования. В CLI показывает часы, минуты, секунды. Но конечно это уже форматированный вывод. Скажем так, мой вывод совпадает с выводом MediaInfo и я считаю его правильным.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 786

Post (Separately) Posted: Mon Nov 04, 2024 18:39    Post subject: Reply with quote

Quote:
Не порядок, когда есть разночтение с MediaInfo, раз плагин ей пользуется.

Понятно. Как говорилось в одном фильме: "Упорядочивание хаоса - очень прибыльное дело" Smile Но если вопрос только в округлении последней секунды, не кажется ли вам, что это больше смахивает на дилемму о наполовину полном и наполовину пустом стакане? )
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 370

Post (Separately) Posted: Mon Nov 04, 2024 19:41    Post subject: Reply with quote

Дело не в округлении последней секунды, а в алгоритме преобразования миллисекунд в часы, минуты, секунды.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1554

Post (Separately) Posted: Mon Nov 04, 2024 20:17    Post subject: Reply with quote

AkulaBig wrote:
А вот при преобразовании в часы, минуты, секунды не надо округлять секунды, а потом от этого округления высчитывать продолжительность.

Так в том-то и дело, что сейчас именно так работает TimingFormat. После внесенных в сентябре изменений. И тогда такой вариант был сочтен правильным. И если сейчас

Quote:
Хотелось-бы увидеть эти изменения в плагине, для стандартных форматов продолжительности.


их приводить к одному варианту, то к какому? Потому что сейчас ваш Custom - миллисекунды обрезает, а стандартный TimingFormat - миллисекунды округляет.

AkulaBig wrote:
Это очень тонкий момент. К сожалению под рукой нет учителя математики, чтобы подтвердить правоту этого выражения. Похоже это соответствует правилам именно при преобразовании в часы, минуты, секунды. В любом случае MI работает именно по подобному алгоритму.

Внутренне функция Integer - это дельфийская функция Trunc, которая просто отсекает дробную часть.

AkulaBig wrote:
Как я писал выше, видимо именно так должно происходить преобразование. Может у вас есть толковое словесное описание, как должно происходить преобразование? Я такого в инете не нашел. Я думаю тут причина в том, что есть разница между округлением и преобразованием. Ведь это не округление.

Преобразование так или иначе будет включать в себя избавление от миллисекунд (дробной части). И этот процесс - вопрос реализации. Нет "правильных" и "неправильных", есть просто разные подходы. Если не брать банковскую специфику их три: округление по математическим правилам (Round), до меньшего (Floor) и большего (Ceiling). MediaInfo использует Floor. Плагин тоже использовал его, в сентябре переделали на Round.

AkulaBig wrote:
Дак в этом и дело, что мы не можем отследить алгоритм преобразования.

Исходники MediaInfo открыты...

Ну вот по-видимому оно, в этом файле функция Duration_Duration123. Насколько я могу судить, округления тут не производится.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 786

Post (Separately) Posted: Mon Nov 04, 2024 20:20    Post subject: Reply with quote

AkulaBig
Я, конечно, небольшой специалист в этих делах, но, по-моему, для расчета времени воспроизведения, например, того же mp3 используются сэмплы (фреймы) и их количество, которое затем переводится в секунды и миллисекунды. Поэтому самым правильным и точным вариантом, имхо, является отображение времени воспроизведения в полном формате, как, например, это делает foobar2000:

File name : Donna Summer - I Feel Love (Extended Mix).mp3
File size : 18.9 MB (19 865 536 bytes)
-
Duration : 8:16.524 (21 896 687 samples)
Sample rate : 44100 Hz
Channels : 2
Bitrate : 320 kbps
Codec : MP3
Codec profile : MP3 CBR
Encoding : lossy
Tag type : id3v2.4|id3v1

Т.ч. выбор формата отображения - это скорее всего действительно дело предпочтения: кому-то хочется или нужно округлять в большую сторону, кому-то обрезать дробную часть, кто знает. На мой взгляд, второй вариант более правилный, т.к. всегда знаешь точное количество целых секунд, держа в голове, что может быть остаток фреймов или миллисекунд.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 370

Post (Separately) Posted: Mon Nov 04, 2024 20:49    Post subject: Reply with quote

Loopback wrote:

Так в том-то и дело, что сейчас именно так работает TimingFormat. После внесенных в сентябре изменений.

В том-то и дело, что работает не так. Я для этого и привел скрин. Не соответствует длительности MediaInfo.
Loopback wrote:

И тогда такой вариант был сочтен правильным.

Мы тогда тестировали файл длительностью 02:36. Он и сейчас показывает правильно.
Loopback wrote:

их приводить к одному варианту, то к какому?

Естественно к варианту, который показывает MediaInfo, иначе я не последний, кто обратит на это внимание. Если-бы MI показывала-бы только миллисекунды, вопросов-бы не было. Но MI показывает продолжительность в разных форматах, в том числе и в ч, м, с. И тут сразу возникает вопрос. А почему у вас длительность не совпадает? Ведь вы используете эту библиотеку.
[quote="Loopback"]
AkulaBig wrote:
А вот при преобразовании в Внутренне функция Integer - это дельфийская функция Trunc, которая просто отсекает дробную часть.

Вы меня не поняли. Учитель сказал-бы правильный математический алгоритм. Назначение функций программирования я и сам знаю.
Loopback wrote:

Нет "правильных" и "неправильных", есть просто разные подходы.

Я думаю, что есть один правильный алгоритм. Но это вопрос дискуссионный. Нет смысла его обсуждать. Я могу допустить, что автор MI не прав.
Loopback wrote:

Исходники MediaInfo открыты...

А я не смог ссылку найти. Спасибо.

Добавлено спустя 4 минуты:

Loopback wrote:
Насколько я могу судить, округления тут не производится.

Ну да.
//Seconds
Sec=(int32s)(MS/1000); //s

Добавлено спустя 2 минуты:

Orion9 wrote:
Поэтому самым правильным и точным вариантом, имхо, является отображение времени воспроизведения в полном формате, как, например, это делает foobar2000:

Интересно. Проверю.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1554

Post (Separately) Posted: Mon Nov 04, 2024 21:18    Post subject: Reply with quote

AkulaBig wrote:
В том-то и дело, что работает не так. Я для этого и привел скрин. Не соответствует длительности MediaInfo.

Естественно, потому что текущая версия TimingFormat - округляет. Согласно вот этому запросу. Если взять релизную 1.1.0, там будет совпадать с MediaInfo...

AkulaBig wrote:
Мы тогда тестировали файл длительностью 02:36. Он и сейчас показывает правильно.

Вообще-то длительность его была 02:36,499, которая согласно мат. правилам округляется в меньшую сторону до 2:36.

Уверен, что полная длительность всех "расходящихся" значений, выделенных на скрине, имеет 500 или больше миллисекунд.

AkulaBig wrote:
Естественно к варианту, который показывает MediaInfo, иначе я не последний, кто обратит на это внимание

В общем всё к тому и шло. Верну исходный вариант с обрезкой по умолчанию и добавлю опцию, как округлять. Кому под вывод какой программы нужно подгонять - пусть и меняет.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 370

Post (Separately) Posted: Mon Nov 04, 2024 22:58    Post subject: Reply with quote

Loopback wrote:
Верну исходный вариант с обрезкой по умолчанию

Действительно. Исходный вариант показывает согласно данным MediaInfo. Сейчас еще уточню по foobar2000. Он, как и все остальные плееры показывает с округлением. Но это на линейке. В свойствах вообще продолжительность не показывает.
Я тогда не знал, как MediaInfo пользоваться. Кстати, а вот встроенный плеер Гислера показывает тоже согласно MediaInfo. В этом вроде ничего удивительного нет, учитывая, что у меня настройка использовать внешние кодеки. В которых используется и MediaInfo. Надо скачать LAV-фильтры, удалить кодек-пак и посмотреть, что покажет.

Добавлено спустя 3 минуты:

Orion9 wrote:
foobar2000:

File name : Donna Summer - I Feel Love (Extended Mix).mp3
File size : 18.9 MB (19 865 536 bytes)
-
Duration : 8:16.524 (21 896 687 samples)
Sample rate : 44100 Hz
Channels : 2
Bitrate : 320 kbps
Codec : MP3
Codec profile : MP3 CBR
Encoding : lossy
Tag type : id3v2.4|id3v1

А как можно эти данные посмотреть? Я скачал первую попавшуюся сборку, там в свойствах файла очень скудную инфу показывает.

Добавлено спустя 19 минут:

Попробовал выше приведенный вариант со встроенным плеером Гислера. Учитывая, что MediaInfo вообще удалена и никак не участвует в выдаче информации. Гислер показывает согласно нашим данным.
Пытаюсь понять логику. Для себя так определился. Сначала мы ищем часы, затем минуты, затем секунды. А не сначала секунды. Видимо на этом и основан правильный алгоритм. Просто на форуме утверждали, что автор mp3tag на этом собаку съел и его решение единственно правильное. И большинство плееро-писателей пошли по этому пути.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 786

Post (Separately) Posted: Tue Nov 05, 2024 00:14    Post subject: Reply with quote

Quote:
А как можно эти данные посмотреть? Я скачал первую попавшуюся сборку, там в свойствах файла очень скудную инфу показывает.

Зачем сборку, когда есть чистая версия:
https://www.foobar2000.org/download
При установке можно выбрать Portable. Плюс отдельная куча компонентов расширяющих функционал:
https://www.foobar2000.org/components

Автор, если не ошибаюсь, один из соразработчиков самых первых версий Winamp, т.ч. собаку он съел не меньшую на этом деле, если не бОльшую Smile

Для прослушивания на компе я, конечно, пользуюсь PotPlayer, но foobar2000, имхо, - крутой технический инструмент. В основном, я использую его фичу ReplayGain для нормализации звука MP4 и MKV файлов для медиаплеера, а также пользуюсь его продвинутым конвертером. Но там еще много другого классного функционала и фич, которые, как правило, идут уже в отдельных компонентах.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1244

Post (Separately) Posted: Tue Nov 05, 2024 01:08    Post subject: Reply with quote

Quote:
Сначала мы ищем часы, затем минуты, затем секунды. А не сначала секунды.

Кто-нибудь может на пальцах объяснить, чем этот способ лучше получения секунд с округлением и уже из них получения часов и минут?
Снова про "02:36" не надо, пусть примерами будут, например, "00:01:59.400" и "00:01:59.600", они же 119400 и 119600 мс.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 370

Post (Separately) Posted: Tue Nov 05, 2024 05:06    Post subject: Reply with quote

Orion9 wrote:

Зачем сборку, когда есть чистая версия:

Неудачный пример получился. foobar в свойствах показывает только с миллисекундами. Я другого вида отображения и в стандартной версии не нашел. А в линейке показывает округленный до секунда. И вопрос остается.

Добавлено спустя 6 минут:

Skif_off wrote:

Кто-нибудь может на пальцах объяснить, чем этот способ лучше получения секунд с округлением и уже из них получения часов и минут?

Если-бы мы сами знали. Возможно, как при арифметических действиях, необходимо соблюдать очередность вычислений. В инете полно хитрых примеров, как неправильная последовательность вычислений влияет на результат. Возможно при преобразовании миллисекунд в ч,м,с тоже самое.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 57, 58, 59 ... 66, 67, 68  Next
Page 58 of 68

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group