-
от 23.01.2019, 19:00
Цитата:
Спасибо. К примеру у меня фильм и два бонуса, и мне нужно чтобы был resume туда, откуда я зашел в меню, и чтобы к resume была привязана одна кнопка. Это я так понимаю невозможно? Потому что последний ответ мне не помог никак.
от 23.01.2019, 19:41
Цитата:
Возможно, но "ручками".
Резюм здесь свой, а не HDMV'шный.
У каждого видео есть его время резюма и, соответственно, отдельная команда резюма для каждого муви. Можно использовать какой-то GPR, в который писать номер муви при старте каждого муви и потом в свиче, по этому номеру, определять что резюмить и вызывать соответсвующую команду резюма.
Хотел чтобы был возврат в основное муви или в продолжение воспроизведения избранного, в зависимости от того где прекратил воспроизведение. Вроде все понятно, но что-то у меня не получается это сделать, наверное потому что GPRов много и они все относятся к избранному, точнее я в них запутался.
Наставьте на путь истинный пожалуйста.
-
Ну по идее все просто. Как Вы определяете что игралось: муви или избранное? Если по какому-то GPR то по нему и делайте SWITCH (например GPR[100]):
Код:
if Custom GPR(100)=0 -> Movie: CONCERT [resume]
if Custom GPR(100)=1 -> Movie: Playlist [resume]
-
Цитата:
if Custom GPR(100)=0 -> Movie: CONCERT [resume]
if Custom GPR(100)=1 -> Movie: Playlist [resume]
Ну да, я так и делал. Но на сколько я понимаю запуск избранного нужно тогда делать тоже соответствующе.
Я делал так:
if Custom GPR(100)=1 -> UDF на основе switch ниже
switch:
if Custom GPR(2)=1 -> PL: Playlist CONCERT [2]
if Custom GPR(3)=1 -> PL: Playlist CONCERT [3]
........
Только запуск избранного так не работает.
-
Скажите что я делаю не так? Просто если делать только
if Custom GPR(100)=0 -> Movie: CONCERT [resume]
if Custom GPR(100)=1 -> Movie: Playlist CONCERT [resume]
то воспроизводится всегда только основное муви.
-
Цитата:
Хотел чтобы был возврат в основное муви или в продолжение воспроизведения избранного, в зависимости от того где прекратил воспроизведение.
Как Вы отличаете что воспроизводить? Где у Вас хранится флаг что воспроизводилось последним?
-
Если я Вас правильно понял, то нужно при остановке воспроизведения диска, при активации stop в избранном, и при заходе в меню из избранного, откуда и планирую делать такой запуск, нужно заносить в storage резюм плейлиста для избранного под GPR(100)=1 а потом эти данные восстанавливать при запуске диска. Так?
-
Вы "возврат в основное муви или в продолжение воспроизведения избранного" хотите из гланого меню, при выходе в главное меню из муви/избранного?
Или при вынимании/вставке диска тоже?
В любом случае - Вам самому нужно где-то хранить флаг того, что игралось последним - муви или избранное. Программа сама такое не сохраняет. И по этому флагу уже и смотреть что запускать.
Для отработки при выходе в главное меню достаточно просто хранить этот флаг в каком-нибудь GPR (в моем примере - в GPR[100]). При запуске муви писать в GPR[100]=0, а при запуске избранного - GPR[100]=1 (как пример).
Чтобы работало при вынимании/вставке диска - придется при установке этого флага записывать его сразу в сторадж и потом при вставке диска - считывать из стораджа в тот же GPR (это все уже только через скрипт).
-
Цитата:
Чтобы работало при вынимании/вставке диска - придется при установке этого флага записывать его сразу в сторадж
Если Вы так написали, то как я понимаю при нажатии OPEN лотка диска в железном плеере, минуя кнопку стоп, тоже можно как-то записывать в сторадж. А как это?
И разве на счет остального я не это же написал? Или записывать резюм муви в сторадж тоже надо?
-
Да, кнопки Stop же нету в Remote control buttons.
Извините за вопрос. Если в Action every second плейлиста вставить скрипт
manager.Store_Streams();
manager.allowSaveState(true);
manager.saveMediaState();
manager.resumeVideoAt('Playlist CONCERT');
manager.setGPR(100, 1);
manager.storeData("GPR100", 1);
это не слишком большой объем записи будет, или каждую секунду новая запись?
-
Зачем Вам Stop или "Action every second"?
При запуске муви (действие Enter (ok) кнопки Play) запоминаем значение в GPR и пишем в сторадж:
Код:
manager.setGPR(100, 0);
manager.storeData("GPR100", 0);
Т.е. конвертируем запуск Play Movie в мультиэкшен или скрипт и добавляем туда этот скрипт.
Аналогично при запуске на проигрывание избранного, только вместо 0 пишем 1 в GPR[100] и сторадж.
-
Вот тут я Вас совсем не понял про кнопку Play, и, да, я уже понял что скрипт надо писать так:
manager.setGPR(100, 0);
manager.storeData("GPR100", 0);
или
manager.setGPR(100, 1);
manager.storeData("GPR100", 1);
и восстанавливаю при запуске диска так:
manager.setGPR(100, manager.readDataInt("GPR100"));
и я их уже добавил в "Action every second" в муви и плейлист а также в попапы муви и плейлиста, просто скрипт или скрипт в мультиэкшены, и это работает безотказно и безошибочно, поэтому мой вопрос остается в силе:
это не слишком большой объем записи будет в "Action every second", или каждую секунду запись обновляется и новая?
-
Цитата:
Вот тут я Вас совсем не понял про кнопку Play,
Кнопка Play в меню, не на пульте. А так же при запуске из Tracklist
Не нужно это в "Action every second". При запуске плейлиста - записываете какой плейлист запустили - зачем каждую секунду то дергать это?
-
@
CDK, Если честно, мне не понятно как работает то что Вы советуете, но я попробовал и это действительно работает. Как говорится - "Проверяй, но доверяй". Пришлось правда вставить скрипт для муви везде где есть выход из избранного в муви, ну и во все заходы в избранное тоже вставил нужный скрипт. Спасибо.
-
Скажите пожалуйста, можно ли к видео h264 - 1920x1080/23,976p сделать например бонусы в MPEG 2 - 720x480/29,97i с соотношением сторон 4:3? Какие могут быть последствия? И примет ли это Scenarist?
-
Касательно сценариста - не знаю.
Касательно последствий - меню для этих бонусов нужно делать в расчете на разрешение экрана 720x480 (в самих бонусах).
-
Цитата:
Касательно последствий - меню для этих бонусов нужно делать в расчете на разрешение экрана 720x480 (в самих бонусах).
Я правильно понял что если соотношением сторон 4:3 то меню 720x480, а если 16:9 то 853x480.
-
@
maks8881, нет.
По стандарту SD пиксели не квадратные, а исключительно
анаморфные, то есть с изменяемым соотношением сторон. По этому что в 4:3, что в 16:9 разрешение одинаковое 720x480 для NTSC и 720x576 для PAL.
-
Цитата:
Я правильно понял что если соотношением сторон 4:3 то меню 720x480, а если 16:9 то 853x480
Нет. Как правильно заметил
Mowny Devam - разрешение экрана одно и тоже будет. А Java работает по разрешению. Но т.к. пиксели будут не квадратные, то, возможно, придется меню адаптировать, что бы оно не выглядело вытянутым/растянутым.
-
Задумал сделать так, чтобы при отображении закладки на таймлинии, отображался текст с названием трека в чаптере которого установлена закладка. Как я понимаю привязка этого текста к чаптеру в switch не поможет, и к GPR тоже. Я так понимаю нужно как то привязать ко времени чаптера. Подскажите пожалуйста как это можно сделать? А можно ли как нибуть сделать чтобы вместо текста отображалось PNG?
-
А надо ли?:)
Там вылезает очень много всяких "но".
Названия некоторые в 2-3 слова. Поставил подряд 3 закладки - текст друг на друга налазить будет - что с этим делать? рассчитывать вертикальное положение? А если 10 закладок и длину текста как считать на ходу? Это все превратится в большой геморрой.
Вообще говоря тогда проще использовать именно текст, без флага "Render to image" и заменять этот текст на назвавние песни. Для получения названия песни можно написать UDF получения имени песни по времени закладки, типа
Код:
public String UDF_GetSongName(long time) {
if (time < 100510000000L) return "Song 1"; // 9082800
if (time < 519750000000L) return "Song 2"; // 46814400
if (time < 877670000000L) return "Song 3"; // 79027200
if (time < 1054110000000L) return "Song 4"; // 94906800
if (time < 1368310000000L) return "Song 5"; // 123184800
if (time < 2165670000000L) return "Song 6"; // 194947200
if (time < 2408230000000L) return "Song 7"; // 216777600
if (time < 2853550000000L) return "Song 8"; // 256856400
if (time < 3174030000000L) return "Song 9"; // 285699600
if (time < 3573950000000L) return "Song 10"; // 321692400
if (time < 4228910000000L) return "Song 11"; // 380638800
if (time < 4686630000000L) return "Song 12"; // 421833600
if (time < 5046070000000L) return "Song 13"; // 454183200
if (time < 5349230000000L) return "Song 14"; // 481467600
if (time < 5803550000000L) return "Song 15"; // 522356400
if (time < 6135630000000L) return "Song 16"; // 552243600
if (time < 6207030000000L) return "Song 17"; // 558669600
return "";
}
PS: время взято из script_Manager.java - GetChapterNumberByTime. В принципе могу ее сделать public и тогда просто можно будет ее вызывать (она теперь всегда генерируется).
Еще можно использовать long time = manager.getBookmarkTime('CONCERT', bookmark) и передавать тогда в функцию не время, а номер закладки (int bookmark).
-
Цитата:
А надо ли? Это все превратится в большой геморрой
Вы меня не поняли, я имел в виду что текст будет всегда один и будет привязан к маркеру, который указывает на закладку, и у меня есть мысли теоретические как это сделать.
Цитата:
if (time < 100510000000L) return "Song 1"; // 9082800
if (time < 519750000000L) return "Song 2"; // 46814400
if (time < 877670000000L) return "Song 3"; // 79027200
if (time < 1054110000000L) return "Song 4"; // 94906800
А то что я выделил - это что? И можно ли это сделать в switch?
-
Цитата:
А то что я выделил - это что?
Слева это часть времени в наносекундах (полное время включает и нули). Это время плеймарка (чаптера).
Справа - это комментарий с соответствующим PTS - время во внутренних единицах видеопотока. 1 секунда = 90000 PTS.
Цитата:
И можно ли это сделать в switch?
Нет.
-
......
if (time < 6036420800000L) return 23; // 543314772
if (time < 6128412700000L) return 24; // 551594043
if (time < 6204989200000L) return 25; // 558485928
return 26;
}
Подсчитал, с незначительными изменениями после 4ой цифры, то что слева, совпадает с тем что выдает MediaInfo после мукса в Сценаристе,
01:37:06.053 : Chapter 23
01:40:36.830 : Chapter 24
01:42:08.822 : Chapter 25
01:43:25.399 : Chapter 26
с изменениями после 3ей цифры совпадает с тем что на плеймарках в Scenes.
01:37:00:07
01:40:30:24
01:42:02:21
01:43:19:06
У меня видео интерлейс 29,97 поэтому так сильней разнится на последних плеймарках.
Цитата:
В принципе могу ее сделать public и тогда просто можно будет ее вызывать
Сделайте пожалуйста.
-
@
CDK,
Скажите пожалуйста, как например это
if (time < 6204989200000L) return 25; // 558485928
правильно привязать к GPR?
Хочу попробовать при добавлении закладки, привязывать закладку к GPR, в зависимости от чаптера, а потом с помощью нужного GPR вызывать нужный текст с песней. Или это будет тоже самое что Вы порекомендовали? В любом случае мне с GPR удобнее будет работать, в смысле привязывать к GPR Move to для текста и нужный текст для песни в switch. Все это только теоретические мысли и когда дойдет до практики я скорее всего окончательно запутаюсь и не буду знать что делать. :)
-
В смысле "привязать к GPR"?
Строка "if (time < 6204989200000L) return 25; // 558485928" возвращает 25 если время менее чем указанное в миллисекундах. Вы хотите записывать это в GPR? Зачем?
-
Цитата:
возвращает 25 если время менее чем указанное в миллисекундах
А простыми словами что это значит?
Я обратно стал тупым, как в начале освоения избранного. :)
-
Цитата:
А простыми словами что это значит?
Ну вот даже не знаю как это объяснить простыми словами :)
Это программирование :) Тут нет понятия привязок или какой-то магии. Функция возвращает значение, а что Вы с этим значение будете делать - это уже Ваше дело.
Нельзя что-то привязать к GPR. Можно при каких-то событиях (нажатие кнопки, окончание видео, каждую секунду и т.п.) выполнять какие-то действия в лоб или проверять условия и выполнять что-то в зависимости от условия.
-
Подскажите пожалуйста как вставить сюда -> if (time < 100510000000L) return "Song 1"; // 9082800 правильно Text и Move to. Нужно две строки создавать?:
if (time < 100510000000L) return setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 1"); // 9082800
if (time < 100510000000L) return moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 200, 200); // 9082800
Поправьте меня пожалуйста если нужны какие то знаки препинания и если что не так.
А вообще if (time < 100510000000L) return "Song 1"; // 9082800 работать в меню или плейлисте то будет?
-
return - это возврат из функции. Он выполняется один раз за вызов функции. И возвращает он при этом значение указанного в описании функции типа.
Из UDF вы можете GetChapterNumberByTime вызывать в лоб (без префикса manager.). Если номер букмарка в bookmarkNumber, то как-то так:
Код:
long time = getBookmarkTime('CONCERT', bookmarkNumber);
int chapter = GetChapterNumberByTime('CONCERT', time);
if (chapter == 1) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 1");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 200, 200);
}
if (chapter == 2) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 2");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 300, 300);
}
....
-
Цитата:
Еще можно использовать long time = manager.getBookmarkTime('CONCERT', bookmark) и передавать тогда в функцию не время, а номер закладки (int bookmark).
Скажите пожалуйста, что значит
bookmark в manager.getBookmarkTime('CONCERT',
bookmark)?
manager.getBookmarkTime('CONCERT', bookmark) это что то сродни time = manager.currentBookmarkTime('CONCERT');?
-
Цитата:
long time = getBookmarkTime('CONCERT', bookmarkNumber);
int chapter = GetChapterNumberByTime('CONCERT', time);
if (chapter == 1) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 1");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 200, 200);
}
if (chapter == 2) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 2");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 300, 300);
}
....
Как я понимаю вместо
time нужно время чаптера вписывать. А в чем его вписывать? Отсюда?:
if (time <
83006666667L) return 1; // 7507500
if (time <
322279033333L) return 2; // 29042013
if (time <
612435566667L) return 3; // 55156101
if (time <
909799300000L) return 4; // 81918837
if (time <
1153976566667L) return 5; // 103894791
if (time <
1450939900000L) return 6; // 130621491
-
нет, time - это переменная, которая определена строкой выше
long time = getBookmarkTime('CONCERT', bookmarkNumber); <--- получаем время букмарка для плейлиста 'CONCERT' по номеру букмарка, который хранится в bookmarkNumber и записываем в переменную time
int chapter = GetChapterNumberByTime('CONCERT', time); <--- получаем номер чаптера для плейлиста 'CONCERT' по времени из переменной time и записываем в переменную chapter
-
@
CDK,
Ну если ничего менять не надо, тогда почему возникает ошибка при компиляции Jar?:
MediaManagement.java:169: cannot find symbol
symbol : variable bookmarkNumber
location: class com.disc_art_authoring.bdjmenu.MediaManagement
long time = getBookmarkTime(4,
bookmarkNumber);
^
1 error
Указатель внизу указывает на первую букву в bookmarkNumber
-
потому что bookmarkNumber вы должны задать - это номер букмарка, для которого вы хотите что-то сделать (вывести текст, сместить маркер)
логичнее это сделать как параметр UDF, но можно все это сразу засунуть в одну UDF без параметров:
Код:
public void UDF_bookmarks() {
int count = getBookmarksCount('CONCERT');
for (int bookmarkNumber = 0; bookmarkNumber < count; bookmarkNumber++) {
long time = getBookmarkTime('CONCERT', bookmarkNumber);
int chapter = GetChapterNumberByTime('CONCERT', time);
if (chapter == 1) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 1");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 200, 200);
}
if (chapter == 2) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 2");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 300, 300);
}
....
}
}
-
Цитата:
но можно все это сразу засунуть в одну UDF без параметров:
Код:
public void UDF_bookmarks() {
int count = getBookmarksCount('CONCERT');
for (int bookmarkNumber = 0; bookmarkNumber < count; bookmarkNumber++) {
long time = getBookmarkTime('CONCERT', bookmarkNumber);
int chapter = GetChapterNumberByTime('CONCERT', time);
if (chapter == 1) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 1");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 200, 200);
}
if (chapter == 2) {
setText("F:MM_MENU_BOOKMARKS.Text_songs", "Song 2");
moveToXY("F:MM_MENU_BOOKMARKS.Text_songs", 300, 300);
}
....
}
}
Ну тогда возникает 100 ошибок.
-
@
CDK,
Я не знаком с программированием и я не знаю откуда Вы взяли то что указано на верху в Вашем UDF, в мануале этого нет и как я понимаю простым смертным этого не дано. Ну если Вы знаете в полной мере правильность написания подобного UDF, то тогда скажите пожалуйста откуда взялось 100 ошибок. А учитывая что они не связаны с этим UDF, то это говорит об ошибке BDS.
Извините если что не так сказал.
-
Ошибка в скриптах - это не ошибка в BDS. Это ошибка в скриптах. Чтобы пользоваться скриптами нужно знать программирование. Иначе не получится. Может выслать проект - попробую посмотреть в течении недели.
-
Цитата:
Чтобы пользоваться скриптами нужно знать программирование. Иначе не получится.
Может быть есть какие нибудь ссылки или мануалы по программированию?
-
Вам нужны основы Java. Есть куча бесплатных обучающих видео на том же ютубе.
-
Скажите пожалуйста, какие параметры должны быть у .wav в Open sound в меню и Sounds на кнопке. Максимальная и минимальная частота дискретизации, сколько каналов допускается, максимальный размер .wav.