PaintCAD Mobile - журнал разработки

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб ноя 15, 2025 12:58 am

Следующий модуль - PngEncoder

Изображение

Масштабирование модуля PngEncoder

При сохранении в PNG этот модуль сохраняет его и показывает стандартное окошко с прогрессом сохранения

Ревизия окна PngEncoder

Сейчас окно выглядит так:

Изображение

Как и другие подобные окошки - масштабируем его на смещения в виртуальных пикселях вместо реальных. И добавим таймер, показывающий сколько осталось до конца.

Здесь два этапа - запаковка и сохранение. Запаковка показывает прогресс, а сохранение включается на 100% и просто скидывает массив байтов в png-файл.

После масштабирования выглядит так:

Изображение

Проверять на разных телефонах его не нужно, оно простое.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб ноя 15, 2025 12:26 pm

Вернемся к окну Palete

По тестам сделано еще несколько доработок:

1) в спектральном подборе текст выбранного параметра сделан с тенью, он был сделан без тени в дремучие времена на старых телефонах, когда при каждой перерисовке окна со спектрами оно рисовалось полностью и чтобы ускорить это дело - тени были выключены (все-таки рисовать минус один текст тени экране). Теперь (уже давно) окно рисуется один раз, а потом перерисовываются только стрелки. Пора включить тени

2) в спектральном подборе раньше рисовались только параметры текущего выбранного цвета. Теперь будем рисовать два параметра (тон и яркость) или один параметр (чернобелый тон) для ПЦ, а чуть пониже их же для ЗЦ. Тогда все параметры будут видны на экране (вместе с двумя ячейками цветов снизу это 6 строк, а на активную область окна за вычетом заголовка и панели софт-клавиш влезть 7 строк должны)

3) в спектральном подборе нельзя было как в PaintCAD 4Windows управлять стрелками с сенсорного экрана. Теперь можно пальцем выбрать тон, выбрать яркость или выбрать ч/б яркость и для ПЦ, и для ЗЦ. Можно, зажимая палец на экране и двигая стрелки, подбирать цвета.

4) перерисовка при повороте экрана (и в режиме сетки, и в режиме спектрального подбора) каким-то образом проглатывается телефоном (долго рисуется что ли). Позже происходит вторая перерисовка, но она думает что окно уже нарисовано и дорисовывает только стрелки, параметры и все динамичное. В итоге вместо полного окна рисовалось только перерисовывающаяся часть. Теперь введем при повороте окна двойную полную перерисовку (чтоб уже точно не пропустить ее). В итоге окно после поворота экрана отрисовывается полностью всегда (еще, конечно, надо проверить на других телефонах)

5) для сони эрикссона почему-то в Palete введена всегда полная перерисовка окна. Интересно почему это. Пока оставим как есть, но надо взять сонерик и проверить бы.

Получилось:

На большом экране:

Изображение

На мелком сименсовском экране (т.к. теперь параметры для обоих цветов видны справа вверху на окошке, то можно выставить точно такие же цвета как на первом скрине по параметрам):

Изображение

Следующий модуль

Это Razbor

Изображение

Ревизия окна Razbor

Показывается как индикатор разборки GIF-файлов при вызове в главном меню "0" - "Обработка" - "Разбор аним.GIF". Т.к. разбор не знает сколько кадров в анимированном гифе, то он показывает только текущий кадр который только что вытащил из анимированного GIF-файла и сохраняет в отдельный GIF-файл кадра. GIF-кадры он кидает в ту же папку, где лежит разбираемый анимированный GIF, называя их 1.gif, 2.gif, 3.gif и т.д.

Сейчас окно выглядит так:

Изображение

Единственную строку сдвинем на центр экрана по вертикали. И посмотрим почему там вообще 0.gif показывается, хотя должно быть 1.gif и далее.

0 там показывается как дефолтное значение явы для целого числа, т.к. первая перерисовка происходит еще до сохранения кадров в файлы.

Будем перед показом окна сбрасывать кадр всегда в ноль, и сначала вместо нуля показывать надпись "Читаем..."/"Reading...". И шрифт сделаем поменьше)

Изображение

А в процессе распаковки будем показывать уже названия файлов с номерами кадров как раньше:

Изображение

На мелком экране окно теперь выглядит так:

Изображение

Масштабирование окна Razbor закончено)

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб ноя 15, 2025 3:53 pm

Следующий модуль

Следующий - Rend

Изображение

Ревизия окна Rend

От слова render, внутри все обработки, эффекты. Окно - очередное окно с прогрессбаром и таймером.

Было:

Изображение

Подтягиваем строки как в других подобных окнах. Таймер тут уже есть. Получилось:

Изображение

Больше в нем масштабировать нечего.

Следующий модуль

Следующий модуль по списку - RGBForce

Изображение

Ревизия окна RGBForce

Сила RGB) Выбирает по каждому из каналов в какую сторону его изменить и на сколько попугаев (силу т.е. выбираем). Используется в настройках эффектов Цветность (меняет насыщенность от черно-белого рисунка до суперперенасыщенного), Цвет (вытаскивает вверх или продавливает к нулю каждую из R, G, B компонент)

Управление:
Кнопками ДжойВверх и ДжойВниз выбираем компоненту
Кнопками ДжойВлево-ДжойВправо или Звездочка-Решетка выбираем силу по этой компоненте.
Кнопками 0-9 быстро выбираем силу, устанавливает текущую выбранную полоску силы в нужное положение.
Кнопками Левый софт или Положить трубку - отменяем эффект.
Кнопками Правый софт или кнопкой джойстика - жмем Ок и переходим дальше.

На сенсорном экране можно регулировать полоски пальцем.

Было:

Изображение

Утолщим полоски чтобы были в полторы высоты шрифта каждая.

Растащим полоски на 1 виртуальный пиксель друг от друга. Сделаем как у полос прогресса в индикаторах отдаление слева и справа от краев экрана на 10 виртуальных пикселей чтобы палец легко доставал до краев. Пробовал 5 пикселей - палец не достает, упирается в чехол телефона. Поэтому 10.

Но сверху еще значок кисти. Тогда оттащим полоски от левого края еще и на ширину значка.

Получилось:

Изображение

Изображение

Еще похожее окно - BlurForce, там отступы были 5 виртуальных пикселей слева и справа:

Изображение

Сделаем тут тоже отступы по 10 чтобы палец доставал до краев полоски:

Изображение

Изображение

Теперь окна Rend и RGBForce тоже отмасштабированы. А BlurForce поправлено.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вс ноя 16, 2025 12:35 pm

Дальше по списку модуль - SaveFile, но это текстовая форма для сохранения в 256-цветный BMP, ее не нужно масштабировать.

Изображение

Еще дальше SBMP24 - это текстовая форма для сохранения в 24-битный BMP, тоже не масштабируется.

И дальше SBMX1664 - опять текстовая форма, для сохранения чернобелых BMX-анимаций из картинки 32х32 пикселя в рисунок стандартного влезающего в смску 4-кадрового BMX 16x64 пикселя (ДжойВлево - "Экспорт" в главном окне при рисовании 32х32 пикселя ч/б картинки или анимации).

Еще дальше SelectMode - это графическое окошко.

Ревизия окна SelectMode

Окошко SelectMode показывается среди стартовых окон один раз за запуск. И дает выбрать режим работы паинткада:

- 8-битный - 256-цветный режим с палитрой, с индексированными цветами, тогда каждая точка рисунка хранит не RGB-значение цвета, а номер (т.е. индекс) цвета в палитре;

- 24-битный - 16-миллионоцветный (теоретически, любые RGB-цвета), но бывает ограничен цветностью экрана мобильного телефона и явы, которая для таких малоцветных экранов и картинки малоцветные хранит в памяти, и рисует, и выдает по запросу при сохранении картинок в файлы;

- обработчик - режим для работы с графическими файлами и их обработки, с выключением всех лишних буферов, освобождением максимального количества оперативной памяти, например, чтобы масштабировать огромные по размерам сохраненные в файлы любые картинки до небольших BMP через "0"-"Обработка"-"???->BMP24", а потом их уже открывать в одном из режимов рисования (в котором их не удавалось открыть напрямую, т.к. не хватало память), или чтобы собирать из больших BMP-файлов символов PCF-шрифты (которые тоже не удавалось собрать в режимах рисования из-за нехватки памяти при загрузке этих больших BMP).

Было:

Изображение

Расставим элементы так:
- 3 виртуальных пикселя;
- заголовок (высота толстого мелкого шрифта);
- 2 виртуальных пикселя зазор;
- надпись "Выберите режим" (высота обычного мелкого шрифта);
- 1 виртуальный пиксель;
- 1 виртуальный пиксель на окантовку значка режима сверху;
- значок режима;
- 1 виртуальный пиксель на окантовку значка режима снизу;
- 1 виртуальный пиксель;
- свич-бокс выбора режима

Цвет окантовки был черный. Как-то это траурно) Попробуем сделать его бледно-фиолетовым как окантовки элементов в других окнах паинткада.

Получаем:

Изображение

Хорошо бы еще отобразить что такое 8-бит и что такое 24-бит. Обрисуем значок тогда не бледно-фиолетовой рамкой, а бледным спектром от красного до фиолетового, грубо изменяющимся для 8-битного режима (как будто мало цветов) и плавно изменяющимся для 24-битного (как будто цветов много). Для "Обработчика" сделаем просто серую рамку, т.к. это режим не для рисования. Толщину рамки сделаем 2 виртуальных пикселя вместо одного чтоб грубо или плавно меняющиеся цвета в спектре были заметней.

Надпись "Выберите режим" сделаем по центру и потолще шрифт.

Растащим элементы на зазоры 2 виртуальных пикселя, т.к. их тут немного, должны влезть на экран.

И сдвинем значок влево, а справа напишем небольшую подсказку в две строки что это за режимы.

Получаем на большом и мелком экранах:

8-битный режим:

Изображение

Изображение

24-битный режим:

Изображение

Изображение

Режим обработчика:

Изображение

Изображение

Теперь окно SelectMode тоже отмасштабировано.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Пн ноя 17, 2025 8:45 pm

Вернемся к окошку SelectMode

Сдвинем-ка значок с подписями на середину, а то в альбомной ориентации на длинном экране значок и текст так и будут слева. Но так, чтобы он не болтался влево и вправо при выборе режима.

Для этого посчитаем суммарную ширину значка и каждой из 6 строчек подсказок (по 2 строчки на каждый режим). Найдем самую большую и вот по ней в сумме с шириной картинки посчитаем где начинает рисоваться картинка слева. Если больше чем 5 виртуальных пикселей от левого края экрана (а спектральная окантовка тогда меньше чем 3 пикселя от левого края экрана), то вот там и рисуем картинку и подсказки для всех трех режимов. А если меньше 5 виртуальных пикселей - то жестко упираем картинку в зазор 5 виртуальных пикселей от левого края, окантовку в зазор 3 пикселя от левого края экрана, а текст подсказок рисуем как раньше, но если он слишком длинный - пусть едет за экран вправо. Текст подобран короткий, так что уезжать, скорее всего, за край экрана вправо при этом он не будет) Только если на очень узком экране и не на андроиде.

И текст подправим чтоб соответствие было какое-то. В 8-битах - 256 цветов, GIF, анимация, а в 24-битах - все RGB цвета (ну все цвета в пределах цветности экрана и явы, вообще-то), без дизеринга (т.е. зернистости).

Стало с центровкой на большом экране:

Изображение

Изображение

Изображение

А на сименсе почти упирается в левый край, т.к. строки слишком длинные (самые длинные для режима "Обработчик"):

Изображение

Изображение

Изображение

Масштабируем следующее окошко

Дальше по алфавиту модуль SelectType

Изображение

Ревизия окна SelectType

Это окно показывается в самом конце списка окон при создании нового файла в 8-битном режиме. А еще можно его вызвать в 8-битном режиме в главном меню "0"-"Настройки"-"Тип рисунка"

Сейчас оно выглядит так:

Изображение

Разложим три опшн-бокса со смещениями в виртуальных пикселях. И под каждым напишем бледную подсказку. И сделаем зазоры в 2 виртуальных пикселя между ними.

Получаем на большом экране:

Изображение

И на маленьком экране:

Изображение

Окно SelectType отмасштабировано.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вт ноя 18, 2025 7:52 pm

Следующий для масштабирования - модуль Selion

Изображение

Ревизия окна Selion

Это окно показывается при выделении фрагмента рисунка функцией "Выделить".

Управление в окошке:
Вверх/Вниз/Влево/Вправо/1-9 кроме 5 - перемещение курсора
Снять трубку (Зеленая кнопка) - скрыть/отобразить информацию на экране
5 - начать/закончить выделять прямоугольное выделение
Решетка - показать курсор крупной квадратной меткой
Левый софт - отмена
Правый софт - принять свежевыделенное выделение как текущее

Сейчас оно выглядит так:

Изображение

Вблизи:

Изображение

Процедура рисования меток была доработана для отрисовки текущего выделения. И окно рисует старое выделение. А еще оно же рисует свежевыделенное новое выделение, такими же цветами как старое. Как только нажмешь Ок (правый софт) - свежевыделенное новое выделение запомнится и при следующем использовании окна уже будет отображаться только последнее выделенное плюс очередное новое свежевыделенное. Поэтому их в окошке два. И они очень похожи друг на друга. Нужно отображать свежее неутвержденное выделение другим цветом чтобы можно было сравнить что было и что стало.

Для обычного выделения выбирался цвет из смеси желтого (255,255,0) и синего (0,0,255). Для свежего неутвержденного выделения выберем чуть сдвинутые оттенки: (255,255,128) - бело-желтый и (0,0,128) - темносиний. Будем рисовать свежее выделение в тех же пикселях "полупрозрачных" (продырявленных) что и старое. При наложении новое выделение будет накрывать старое.

Теперь по кнопке "*" включается режим "Прицеливания" и появляется, как в других окнах, область увеличения 11x11 пикселей.

Если старое выделение не видно - значит выключен его показ) Включить его можно в настройке "0" - "Настройки" - "Показ выделения"

Начинаем выделять - и свежее выделение видно в области 11x11:

Изображение

Если до этого уже было выделения - то и на картинке, и в области 11x11 видны оба выделения: старое утвержденное желто-синее и новое неутвержденное светложелтое-темносинее. У неутвержденного двигается угол с перемещением курсора, утвержденное стоит на месте:

Изображение

Доходим курсором, например, до другого угла старого выделения, и относительно него примеряем новое, например, выше и левее на три пикселя:

Изображение

На белом фоне примерно аналогичная картинка - полупрозрачные старое (желто-синее) и новое (светложелто-темносинее):

Изображение

Отключаем прицеливание по "*" и остаются только старое и новое выделение на картинке линиями толщиной 1 пиксель:

Изображение

На мелком экране сименса примерно то же самое, попробуем на цветном рисунке градиента:

Новое и старое выделение с прицеливанием по звездочке:

Изображение

И они же без прицеливания по звездочке:

Изображение

Вроде бы и всё с этим окном. Больше масштабировать нечего.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Ср ноя 19, 2025 7:49 pm

Небольшие правки

- в главном окне по двойному нажатию "#" появлялась метка, показывающая где курсор. После масштабирования она появлялась относительно левого-верхнего угла экрана и не учитывала текущий масштаб рисунка. Теперь она появляется на рисунке и учитывает масштаб
- в окне обновления надпись "Скачать" была выше на строку чем надо. Теперь это исправлено

Следующий модуль для масштабирования

Дальше идет модуль SGIF - это текстовая форма, ее не масштабируем.

Следующий для масштабирования - модуль ShadowDist

Изображение

Ревизия окна ShadowDist

Окошко показывается для эффекта "Тень" ("*"-"Тень" в главном окне). В нем эффекту указывается на сколько пикселей и в какую сторону сдвинуть тень.

Управление в окошке:
1-9 кроме 5 - перемещение тени
Снять трубку (Зеленая кнопка) - скрыть/отобразить информацию на экране
Левый софт - отмена
Правый софт - принять свежевыделенное выделение как текущее

Сейчас оно выглядит так:

Изображение

Растаскивает строки на смещения в виртуальных пикселях.

Размер квадратика и его тени - был 60 пикселей. Сделаем его равным четырем высотам шрифта. В окно на андроиде должно влезть - там внутренняя часть окна (за вычетом заголовка и софт-клавишной панели) по минимальному размеру около 7 высот шрифта. В яве тоже должно, обычно в экран больше строк влезает чем 4+2.

Еще сделаем чтобы джойстик тоже управлял смещением тени.

А еще добавим таймерный keyRepeated, который при долгом удерживании клавиш перемещения тени начинает ее двигать все быстрее, а при одиночном нажатии клавиш перемещения - просто двигает тень на 1 пиксель в выбранную сторону.

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

Нарисуем красный кружок на рыже-синем градиенте:

Изображение

Вызываем эффект Тень:

Изображение

В отмасштабированном окне ставим смещение, например, 4 по горизонтали, 2 по вертикали:

Изображение

Тень рисуется поверх фона:

Изображение

На мелком экране сименса окошко ShadowDist:

Изображение

Теперь окно ShadowDist отмасштабировано и доработано.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Чт ноя 20, 2025 7:42 pm

Небольшие правки

- в окне ShadowDist тень могла уехать с экрана ниже, залезть на виртуальную клавиатуру.

Изображение

Теперь вывод окна ShadowDist ограничен экраном вне виртуальной клавиатуры

Следующий модуль для масштабирования

Дальше SPNG-модуль - это тоже текстовая форма, ее опять не масштабируем.

Затем идет Stretcher - модуль с кучей методов масштабирования значков интерфейса. У него нет вывода на экран, нет окошка, и поэтому масштабировать в нем нечего.

Потом идет модуль Support

Изображение

Ревизия окна Support

Окошко вызывается через "0"-"Справка"-"Поддержка".

Окно вместо того чтобы оказать поддержку - просит поддержать автора и клянчит перевод денег на вебмани кошельки.

Сейчас оно выглядит так:

Изображение

Вебмани давно уже прикрыло рублевые кошельки и вообще затихло. Сделаем это окно действительно про техническую и другую поддержку. Поставим сюда ссылку на канал Telegram)

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

Получаем на андроиде - ссылка кликабельна, кидает в телеграм на канал. И левый софт делает тоже самое:

Изображение

Изображение

И на яве - ссылка некликабельна, но подкрашена как ссылка (остается ввести вручную этот blackstrip_ru в поиск в телеграме):

Изображение

Изображение

Всё, окно Support отмасштабировано и поправлено.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Пт ноя 21, 2025 6:47 pm

Следующие три модуля опять текстовые: SWBMP, SWICO, TextInput.

И потом идет модуль Tools

Изображение

Ревизия окна Tools

В этом окошке показывается три меню - "Инструменты" (правый софт в главном окне), "Эффекты" (звездочка в главном окне) и "Выделение+буфер обмена" (решетка в главном окне).

Сейчас оно выглядит так:

Изображение

Но на некоторых телефонах вместо инструментов показывается пустое окно отчего-то - вот на Soyes XS13. А эффекты и выделение+буфер показываются отлично. Надо будет это починить:

Изображение

Оно уже частично отмасштабировано, отмасштабированные при загрузке значки раскладываются по окошку в нужные позиции. Но рамка вокруг выделенного квадрата совсем не толщиной с виртуальный пиксель, а тоньше.

Сделаем такой расклад по горизонтали:
- отступ в 3 виртуальных пикселя
- зазор в 1 виртуальный пиксель для рамки-курсора
- значок1 + зазорX + значок2 + зазорX + значок3 + зазорX + значок4 + зазорX + значок 5
- зазор в 1 виртуальный пиксель для рамки-курсора
- отступ в 3 виртуальных пикселя

Тогда первый значок будет в 3+1 виртуальных пикселях от левого края. А последний будет в 3+1 виртуальных пикселях от правого края. Это по максимуму как можно раскидать значки по горизонтали.

И когда посчитаем зазорX и если он больше 3 виртуальных пикселей (значит значки влезают, да еще и место между ними есть для рамки курсора от левого значка, этой же рамки от правого значка, и еще пустое есть больше 1 виртуального пикселя) - добавим к отступам от краев экрана дополнительный зазор чтобы стала центральная часть раскладки такая:
зазорX/2 + значок1 + зазорX + значок2 + зазорX + значок3 + зазорX + значок4 + зазорX + значок 5 + зазорX/2

ну и посчитаем зазорX уже с этими дополнительными отступами чтоб все ровно было.

По вертикали сделаем так:
- 3 виртуальных пикселя
- высота жирного шрифта
- 1 виртуальный пиксель
- зазор в 1 виртуальный пиксель для рамки-курсора
- значок1 + зазорY + значок2 + зазорY + значок3
- зазор в 1 виртуальный пиксель для рамки-курсора
- 1 виртуальный пиксель
- высота панели софт-клавиш

Сверху донизу значки раскидаются почти вплотную к заголовку и к панели софт-клавиш.

И когда посчитаем зазорY и если он больше 3 виртуальных пикселей - значит место есть и добавим отступы по ползазораY сверху и снизу, пересчитав зазорY.

Получаем (тут место есть, поэтому значки стянулись к центру, отступы между ними по зазоруX/зазоруY, а по бокам от строк/столбцов значков еще по половине соответствующего зазора):

Изображение

Изображение

Изображение

Посмотрим на разных мелких экранах:

Сименс 132х176

Изображение

Soyes XS13 320x240
который запоказывал значки в инструментах:

Оказалось, забыл сюда добавить проверку на высоту экрана, которая была при загрузке и масштабировании значков инструментов. И окно предполагало что есть увеличенный в 2 раза рисунок для окна инструментов, а его не было. Получается ошибка с пустыми значками инструментов была только при немасштабированных значках (на мелких экранах), на экранах чуть больше чем 176 точек в ширину. Теперь проверка на высоту сюда тоже вставлена и окно правильно определяет какие значки берем - масштабированные или нет. Значки теперь пропадать не должны.

Изображение

Joy's S13 128x160

Изображение

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

Теперь окно Tools отмасштабировано и доработано.

Аватара пользователя
blackstrip
Админ
Сообщения: 1307
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб ноя 22, 2025 12:34 pm

Дальше три модуля текстовые немасштабируемые: uf1, uf2 - прокладки для работы с файлами разных файловых систем, VGinput - ввод имени файла для анимированного гифа.

И потом идет модуль Video3GP

Изображение

Ревизия окна Video3GP

До этого окна в паинткаде можно добраться если захотеть извлечь кадр из видео-файла. А делается это так (на эмуляторе сименса оно работает, видео проигрывает, останавливает, но кадры почему-то не снимает, видимо, потому что эмулятор. Эмуляторы, бывало, глючили на некоторых функциях, а реальные телефоны работали):

1) в главном меню выбрать "0"-"Обработка"-"Снять 3GP/MP4 кадр"

Изображение

2) прочитать подготовительное сообщение что сейчас надо будет выбрать файл с видео

Изображение

3) выбрать в файловом менеджере файл (подложил эмулятору какой-то старый 3GP из 2006 года)

Изображение

4) прочитать еще одно сообщение про управление окном

Изображение

5) появится окно Video3GP - оно будет пустое (можно рассмотреть что тут можно отмасштабировать)

Изображение

6) и потом, когда видео загрузится в плеер, появится видеовывод, который сразу запроигрывается, отрисовываясь прямо от левого верхнего угла (поэтому обычно он сразу закрывал заголовок окна, и в заголовке просто слово-заглушка "Video" поэтому, все равно его никто не видит обычно в процессе проигрывания видео и выбора кадра):

Изображение

Внизу окна отображается размер видеорастра в пикселях "ширина x высота".
Еще ниже - текущий файл. При съемке по "5", судя по коду, должно произойти следующее:
1) если открывали, например, 0:/Videos/test.3gp, то имя снятого кадра будет выбрано как 0:/Videos/test-0.jpg для сименса и 0:/Videos/test-0.png для всех других моделей
2) в этот файл, в ту же папку где был видеофайл, с запросом у плеера "encoding=jpeg" будет сохранен кадр из видеопотока
3) логика этого окна была в том, чтобы нащелкать много кадров, и они бы сохранялись бы по очереди в test-0.jpg, test-1.jpg, test-2.jpg и т.д. Кнопкой "# - в начало" можно было сбросить счетчик кадров и снова начать сохранять с нулевого (перезаписывая предыдущие сохраненные файлы)

Но после съемки первого кадра вписан выход из окошка в главное окно рисования с показом сообщения:
Снимок
сохранен
под именем
0:/Videos/test-0.jpg


Т.е. больше одного кадра оно не снимало. Поэтому номер кадра всегда был 0. И сохраняемый файл всегда был бы в данном случае 0:/Videos/test-0.jpg.

Наверное, плеер не хотел снимать больше одного кадра. Поэтому чтоб снять еще один приходилось закрыть плеер и открыть новый (снова выбрав файл и т.д.).

Попробовал запустил эту же функцию "Снять 3GP/MP4 кадр" на другом эмуляторе сименса побольше (EL71, 240x320). Он зашел подальше - после нажатия кнопки съемки он спрашивает разрешения на съемку. Но после этого ничего не сохраняет. Можно только выйти из окошка по левому софту:

Изображение Изображение Изображение Изображение Изображение Изображение Изображение

Есть подозрение что enconding=jpeg почему-то не работает в эмуляторе. Эмулятор даже скриншоты сохраняет в tga, а не в png/jpg. Может JPEG это была платная технология и ее не стали добавлять в эмулятор. Или работает супермедленно и чутко, так что надо не дышать и ничего не нажимать в этот момент чтобы его не спугнуть)

Как оно должно работать теперь понятно.

Для начала отмасштабируем строчки, разместив их над панелью софт-клавиш чтобы в обоих сименсах (да и на других телефонах) их было видно.

Изображение Изображение

Изображение

(на сименсе с экраном покрупней эмулятор сначала рисует видеопоток из файла пониже, а потом прыгает вверх, оставляя внизу статично нарисованным один из первых кадров, поэтому такая двойная картинка. На реальном телефоне, насколько помню, такого не было)

Т.к. явовские плееры в microemu не реализованы, то сделаем свой плеер. Для андроида сделаем отдельный модуль Video3GP2 (прямо как в функции съемки фото с камеры), в заголовок окошек Video3GP и Video3GP2 вместо Video впишем название. Получается такое пустое окошко Video3GP2:

Изображение

Для доставания кадров из видео в андроиде есть, например, android.media.MediaMetadataRetriever. Написано, что появился он в API level 10 - т.е. Android 2.3.3. Подходит вроде.

Создаем новый MediaMetadataRetriever и передаем туда пусть и имя файла в строке fnam, выбранные в файловом менеджере:

Код: Выделить всё

import android.media.MediaMetadataRetriever;
...
mdr = new MediaMetadataRetriever();
mdr.setDataSource(fnam);
Теперь запросим кадр по смещению во времени. Запросим самый первый кадр, смещение = 0 микросекунд. Если он не null - значит что-то там есть внутри. Запакуем его в JPG и превратим в массив байтов, который уже передадим паинткаду. Такой массив можно и загрузить в Image для показа на экране, и просто сохранить в файл (когда пользователь запросит сохранение в файл). Можно даже сразу загрузить в паинткад на рисунок (можно будет добавить еще и эту опцию, чтоб сразу доставать кадр и загружать на текущий рисунок, без сохранения в JPG-файл):

Код: Выделить всё

long toff = 0;
Bitmap bmp = mdr.getFrameAtTime(toff, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);

if (bmp!=null)
{
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
       ssphoto = baos.toByteArray();
}
И вот какой первый кадр видео рисуется в окошке - оно работает, по крайней мере, на Android 15 (должно по описанию на с 2.3.3 и новей работать, потом надо будет проверить на всех телефонах). Информации никакой еще не рисуется, только картинка для теста, поэтому пишет 0x0:

Изображение

Теперь осталось накрутить туда интерфейс, сенсорное управление и посмотреть с какой скоростью этот MediaMetadataRetriever достает кадры из видео.

Сначала сделаем чтоб кадр рисовался в пределах области окна, не залезая на информацию. Обрисуем кадр (или его часть, попадающую в активную область окна) рамкой толщиной 1 виртуальный пиксель.

На видео, параметры которого
Video: S263 128x96 12.5fps 51kbps [V: English [eng] (h263, yuv420p, 128x96, 51 kb/s)]
Audio: AMR 8000Hz mono 12kbps [A: SoundHandler [eng] (amr_nb, 8000 Hz, mono, 12 kb/s)]

вывод кадра такой:

Изображение

Еще на большом видео, снятом на самом смартфоне, с параметрами
Video: MPEG4 Video (H264) 1920x1080 30fps 18400kbps [V: VideoHandle [eng] (h264 high L4.1, yuv420p, 1920x1080, 18400 kb/s)]
Audio: AAC 48000Hz stereo 320kbps [A: SoundHandle [eng] (aac lc, 48000 Hz, stereo, 320 kb/s)]

вывод кадра такой (причем в видео, видимо, записан поворот телефона с гироскопа, как в JPG-снимках бывает подобное, поэтому MediaMetadataRetriever загружает его правильно, повернутым):

Изображение

Интересно что кадр 128x96 пикселей MediaMetadataRetriever масштабировал сам до 320x240. Интересно почему. Но он масштабировал со сглаживанием, ничего так.

Уберем это придумывание имен кадров, и сделаем отсчет с первого кадра. Будут просто файлы 1.jpg, 2.jpg и т.д помещаться в папку исходного видео-файла.

Слева внизу отобразим размер (ширину x высоту) кадра, а справа внизу - будущее имя файла для сохранения кадра.

Повыше нарисуем текущее смещение (сначала оно ровно нулю). Андроидовский MediaMetadataRetriever понимает смещения в микросекундах. Но, вообще, при 25 кадрах в секунду каждый кадр будет 1 000 000 мкс / 25 = 40 000 мкс. Поэтому достаточно показывать секунды и миллисекунды, кадры будут лежать по смещениям в 0 секунд, потом в 0.04 секунды, в 0.08 секунды и т.д. Будем показывать их в виде дробного числа секунд с тремя цифрами после запятой. Будем показывать запятую-разделитель целой и дробной частей числа для русского языка и точку для английского.

Получаем:

Изображение

Теперь попросим у андроида длительность всего загруженного в MediaMetadataRetriever видео чтобы и ее отрисовать на экране рядом с текущим временным положением:

Код: Выделить всё

String dura = mdr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long dur = Long.parseLong(dura);
Теперь в dur у нас длительность. Причем она в миллисекундах.

Нарисуем ее на окошке и проверим в обычном каком-нибудь плеере что все правильно:

Изображение

Изображение

И паинткадовский, и обычный плеер показывают 19 секунд. Паинткад показывает до миллисекунд)

Другое видео:

Изображение

Изображение

Тоже оба плеера показывают 6 секунд. Теперь паинткад знает длительность видеофайла.

Теперь сделаем вместо просто показа "текущее положение / максимальная длительность" большой слайдер, двигая пальцем по которому можно будет перемещаться в любое место видео. А уже на нем отобразим текущее и максимальное положение. По бокам еще сделаем две стрелки для "покадрового" перемещения (например, по 400 мс за клик). Получаем:

Изображение

Теперь сделаем стрелки и полоску-слайдер управляемыми. Кнопки 4/6 и влево/вправо сдвигают позицию на 40 мс (40000 мкс). А клик по слайдеру пальцем мгновенно переставляют позицию в указанную.

Оказалось, что

Код: Выделить всё

Bitmap bmp = mdr.getFrameAtTime(toff, MediaMetadataRetriever.OPTION_CLOSEST_SYNC) 
выдает ближайший "ключевой" кадр, а их там в видео один кадр в полсекунды-секунду.

Заменим эту команду на

Код: Выделить всё

Bitmap bmp = mdr.getFrameAtTime(toff, MediaMetadataRetriever.OPTION_CLOSEST) 
это то же самое, но без SYNC, теперь кадров стало гораздо больше. И при каждом перемещении вправо/влево на малые смещения теперь кадр меняется.

Изображение

3GP видео встроенный в андроид декодер распознает странно, первый кадр - нормально, остальные - в зеленых тонах) глючит, в общем. Ну ладно. Встроенный в андроид плеер тоже рисует этот 3GP в зеленых тонах. И только сторонние плееры (которые, видимо, сами декодируют кадры) рисуют это видео нормально. Проверим потом еще отрисовку этого видео на других андроидах, может там все ок, и это в 15 андроиде такие чудеса с проигрыванием старых 3GP.

Изображение

По 1 кадру (40 миллисекунд) можно долго мотать видео. Поэтому сделаем такое управление:
1) клик по слайдеру и перемещение его пальцем - переход сразу в указанное место
2) стрелками на экране слева/справа от слайдера текущего положения - по 1 кадру перемотка (40 мс)

А если сенсорного экрана в андроиде нет или хочется переместиться в конкретное место (например, ровно на 5 секунд вперед), то:
3) цифрами 4 и 6, джойстиком Влево и Вправо - тоже по 1 кадру перемотка (40 мс, будем считать что в видео 25 кадров в секунду)
4) цифрами 1 и 3 - по 1 секунде сразу перемотка
5) цифрами 7 и 9 - по 10 секунд перемотка
6) цифрой 2, джойстиком Вверх - перейти в самое начало видео
7) цифрой 8, джойстиком Вниз - перейти в самый конец видео
8) цифрой 5 - перейти в середину видео

Чтобы во всем этом не запутаться - сделаем на виртуальной цифровой клавиатуре другие значки в этом окне съемки кадров из видео.

Обычные стрелки (в других окнах на виртуальной клавиатуре), оказывается, до сих пор рисуются с подложкой (типа тень, а даже, скорее, как будто они объемные и это их бок виден сверху) со сдвигом 2 реальных пикселя. Сделаем эти сдвиги равными одному виртуальному пикселю:

Изображение

А для съемки кадров нарисуем на виртуальной клавиатуре другие значки: одна стрелка - медленно мотать (40 мс за шаг), две - быстрее (1 секунда за шаг), три - еще быстрее (10 секунд за шаг). Еще сделаем стрелку, упершуюся в границу слева (перемотка в начало видео). Такую же, упершуюся в границу справа (перемотка в конец видео). И еще одну - в середине граница, а по бокам две стрелки ее сжимают (перемотка в середину видео).

С тенями/объемом на центральной кнопке вообще непонятно что делать) Она как бы сверху ровно наблюдается, поэтому пусть левая стрелка отбрасывает объем в одну сторону, а правая в другую, плюс еще поправки на сдвиг объема верха и низа стрелок. По хорошему, на центральной кнопке вообще подложку не надо рисовать. Но если нарисовать, то, в общем, получилось вот так пока что:

Изображение

Эта же центральная кнопка "5" без сдвигов подложки по вертикали:

Изображение

И она же без подложки вообще:

Изображение

Наверное, оставим ее как в последнем варианте - т.е. без подложки.

На виртуальной клавиатуре еще с древних времен на прямоугольных клавишах нарисованы вот эти "блики" и "тени" от выпуклости клавиши. Их ширина - 2 физических пикселя для любых телефонов. Сделаем их масштабируемыми. Чтоб как на мелком, так и на большом экране выглядели одинаково.

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

Получаем на большом экране:

Изображение

Изображение

И на экране поменьше (320x480):

Изображение

Изображение

Что касается клавиатуры в окне съемки кадров из видео - теперь она будет выглядеть вот так с этими кнопками:

Изображение

Кнопка перемотки с одной стрелкой мотает на 1 кадр (40 мс), кнопка с двумя стрелками мотает на секунду, а кнопка самой быстрой перемотки (с тремя стрелками) перематывает на 10 секунд. А если видео будет 2-часовое, скачанное с инета, из которого захочется понадергать кадров?

Сделаем кнопку с тремя стрелками такую: перематывает на 5% от длительности видео, но если эти 5% меньше 10 секунд - то перематывает на 10 секунд.

Вот на большом видео (снял для теста больше 200 секунд длительностью) эти 5% будут точно больше 10 секунд - и тогда кнопка с тремя стрелками перематывает на 20-тую часть длительности видео (в данном случае это 11,408 с). За 20 нажатий можно пройти от самого начала до самого конца видео, быстро докатившись до любой части видео, а потом уже кнопками перемотки с двумя или с одной стрелкой точно переместиться на нужный кадр, при любой длительности видео, хоть при двухчасовом фильме:

Изображение

На кнопку "звездочка", как в других окнах, сделаем масштабирование - тут это будет масштабирование видео под область вывода видео между заголовком окна и слайдером позиции.

При включенном по "*" масштабировании большой кадр видео превращается в маленький и влезает ровно в область вывода видео (это не повлияет на размер снимаемого кадра, сделано только для просмотра всего кадра видео "на весь экран" перед его съемкой и вытаскиванием в паинткад для редактирования или в файл):

Изображение

Изображение

А маленький, наоборот, растягивается до большой области вывода видео:

Изображение

Изображение

Стартовое сообщение при вызове функции съемки кадра из видео было такое:

Изображение

Пропишем его поподробнее, т.к. в андроидах помимо 3GP/MP4, бывает (зависит от устройства), что поддерживаются и другие видеоформаты:

Изображение

На сименсе на мелком экране текст, вроде, влезает нормально на обоих языках:

Изображение

Изображение

Попробовал открыть AVI-файлы, с запаковкой кодеками и без - ни один не грузится) Вылетает исключение. Сделаем чтобы при исключениях при открытии файла окошко запоминало что файл не загружен и сообщало об этом. Кнопка "Снимок" тогда будет недоступна. Останутся только софт-клавиши на закрытие окошка и на выбор другого видеофайла. Получилось:

Изображение

Изображение

Теперь отцентрируем вывод кадра в активной области. И сообщение об ошибке загрузки тоже отцентрируем. Получилось на мелком видео - без масштабирования по *, с масштабированием по *, и на сообщении об ошибке:

Изображение

Изображение

Изображение

Теоретически могут быть качественные видео (например, пиксельные), которые хорошо бы не пережимать в JPG, а вытащить кадр без потерь качества. Например, сохранять в PNG. Сделаем по кнопке "0" переключение форматов. Сначала внизу пишет "1.jpg":

Изображение

После нажатия "0" окно переключается на вывод "1.png". При этом обновляет кадр, вытаскивая его через PNG формат, а не через JPG. И все кадры, которые будут вытаскиваться - будут без потерь качества в PNG формате. Для переключения обратно на JPG нужно еще раз нажать "0".

Изображение

Еще сделаем проигрывание видео, подобно тому как это было в явовском плеере в окошке Video3GP. Сделаем на кнопке "#" включение проигрывания - тогда видеокадры пытаются выводиться каждые 40 мс, но т.к. вытаскиваются они MediaMetadataRetriever-ом медленно, то фпс, конечно, падает. При выводе очередного кадра плеер смотрит сколько прошло времени на вытаскивание и вывод последнего кадра, и вытаскивает следующий кадр уже с этим смещением по времени. Получается, что плеер играет видео в реальном времени (1 секунда видео - за 1 секунду времени), но просто с низким фпс. Чем медленней телефон - тем ниже фпс, но скорость проигрывания совпадает с реальным временем.

На клавиатуре на "#" нарисуем кнопку проигрывания:

Изображение

А если проигрывание уже включено - будем рисовать там кнопку паузы (второе нажатие на "#" останавливает плеер):

Изображение

Проверка на Android 15 на еще одном видео-формате OGV (OGG-video): андроид загружает его в MediaMetadataRetriever без ошибок, но кадры из него не достает, и длительность получить не удается. Дополнительно будем считать загрузку видео неудачной и выдавать сообщение об этом если после запроса длительности он был неудачным (и длительность так и осталась равная нулю) или вернул ноль (хз как на каких моделях телефонов будет).

На подписи к левой софт-клавише "Отмену" заменим на "Выход", какая отмена когда уже снял десяток кадров в файлы, этого уже не отменить.

Сделаем два режима съемки - в паинткад и в файл. Переключение между ними сделаем по Джойстику Влево/Вправо или по нажатию на переключатель. Сам переключатель нарисуем вместо заголовка окна (эдакий переключаемый заголовок, со стрелками по бокам). Т.к. варианта всего два, то что жми на его правую часть, что на левую - переключает по очереди первый и второй режимы съемки.

Когда снимаем в паинткад - то имя файла (номер кадра и JPG/PNG формат) показывать не будем:

Изображение

А когда снимаем в файл - то будем:

Изображение

Проверяем оба режима.

1) Съемка кадра в PaintCAD

Поставим макс.размер рисунка 800x800. Откроем видео 1080x1920. Докрутим видео до какой-то позиции и нажмем "Снимок":

Изображение

Паинткад снимает кадр, видит что он больше максимального размера рисунка и тогда масштабирует этот кадр так, чтобы он влез в максимальный размер. Получается кадр из видео размером 450x800:

Изображение

2) Съемка кадра в файл

Откроем это же видео 1080x1920. Выбираем кадры и жмем "Снимок". Кадр снимается и сохраняется в файл. Счетчик в правом нижнем углу увеличивается на 1. Чтобы его сбросить - нужно еще раз открыть этот файл ("Обзор" по правому софту и выбрать его). Снимем в файлы, например, 3 кадра. Следующий был бы 4.jpg, но его снимать не будем:

Изображение

Названия файлов будем в андроид-модуле съемки кадров делать как в модуле съемки кадров для явы: при имени видеофайла vid.mp4 кадры будут vid-1.jpg, vid-2.jpg, vid-3.jpg и т.д. Посмотрим в окошке файлового менеджера - вот они лежат рядом с исходным видеофайлом:

Изображение

Подсказку по управлению оставим и для андроида (показывается после выбора видеофайла в файловом менеджере перед переходом к окошку Video3GP2), но только пропишем функции кнопок для андроид-окошка:

Изображение

Внизу формат JPG или PNG все-таки нужно показывать и для режима съемки кадра на рисунок в PaintCAD, т.к. по нему можно определить пережимается ли кадр в JPG или вытаскивается в паинткад через PNG (без потерь качества после вытаскивания из MediaMetadataRetriever-а). Отобразим только формат (JPG или PNG) большими буквами в правом нижнем углу:

Изображение

Теперь окно, вроде бы, доделано. Проверяем на других андроидах.

Samsung Galaxy Ace на Android 2.3.3 - снимем с его же камеры mp4-видео и попытаемся его открыть. Открывает, узнает длительность видео правильно, показывает кадр:

Изображение

НО какое бы не выбирать смещение во времени - отдает один и тот же кадр.

В интернете пишут, что MediaMetadataRetriever впервые появился в Android 2.3 и в старых андроидах сильно зависел от конкретной реализации, конкретного телефона. Сначала появился запрос кадра getFrameAtTime(время в мкс), и нельзя было указать брать ключевые опорные кадры или любой ближайший. Потом в 2.3.3 появились методы какой брать кадр (ближайший любой, ближайший ключевой с любой стороны указанной временной отметки в мкс, из предыдущих кадров относительно отметки, из следующих кадров).

В общем, берет какой-то один кадр и показывает)

Пробуем каждый раз для получения кадра создавать новый MediaMetadataRetriever, открывать видеофайл, просить один единственный кадр по нужному смещению во времени, закрывать видеофайл - не помогает

Пробуем отследить не происходили ли какие-нибудь исключения - нет, не происходили, он работает как будто все ок, только выдает одно и то же изображение для любого смещения во времени.

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

Пробуем запросить кадр старым методом из Android 2.3 getFrameAtTime(время в мкс) - снова выдает только один кадр для любого смещения во времени.

Казалось бы "какой глючный MediaMetadataRetriever, не показывает кадры, может быть мы что-то не то делаем, надо все починить". Но с 3GP видеофайлами он ведет себя иначе)

При проигрывании 3GP, снятого на старом сименсе в 2006 году, он то рисует нормальный кадр (но статичный, не меняющийся), то рисует зеленые кадры, и даже зеленые кадры с разноцветным мусором. И вот находим это место, где он перескакивает на зеленый. Бегаем по 40 мс влево-вправо от этого места.

Последняя временная отметка, где кадр статичный, но выглядит нормально:

Изображение

И на 40 мс позже - зеленый экран:

Изображение

И если перейти на 40 мс назад - то опять будет красивый кадр. Т.е. декодер видео в андроиде есть, он работает, на каждую временную отметку у него есть в ответ конкретный кадр. И если бы он нормально декодировал, он бы получил все кадры нормально рисующиеся и меняющиеся в зависимости от смещения по времени. И точно также, как выше прыгает с нормального кадра на зеленый, прыгал бы с одного нормального кадра на другой нормальный и все бы было ок.

Значит, действительно, в старых андроидах MediaMetadataRetriever работает так себе. Кадры выдает отлично, опции MediaMetadataRetriever.OPTION_CLOSEST как-то слушается, исключений не выдает, но в возвращаемых кадрах нарисован либо первый неменяющийся кадр из видеофайла, либо зеленый фон/мусор и т.д. И его функционирование может вообще зависеть не только от версии андроида, а еще и от модификации андроида на конкретном телефоне. На одном телефоне с андроидом 2.3.3 покажутся статичные кадры, на другом мусорные, на третьем все будет ок (если там каким-то образом все допилено в MediaMetadataRetriever разработчиками прошивки до работоспособного состояния).

Поэтому чинить ничего не надо, все в порядке. Поэтому на некоторых старых андроидах, вероятно, функция "Снять 3GP/MP4 кадр" будет вытаскивать только один кадр или шумы/мусор.

И, кстати, если с mp4 на новых андроидах все отлично, то с 3gp все не так радужно - даже на новых андроидах редкие (опорные) кадры рисуются нормально, остальные как будто должны накладываться на тот опорный по очереди, но андроид этого не понимает и, затирая опорный кадр следующими кадрами, начинает рисовать только измененные фрагменты на зеленом фоне, сером фоне, в странной искаженной палитре. Видимо, с декодированием 3GP в андроидах беда (это видно и по встроенному в телефоны видеоплееру - они 3GP рисуют также некорректно).

С этим ничего не поделаешь если только не написать свой декодер для 3GP, а для старых андроидов и для mp4, а еще для ogv, avi со всеми кодеками, и еще для десятка других видеоформатов, и этого делать мы конечно же не будем))

Чтоб ничего не писать есть еще сторонние готовые модули типа FFmpegMediaMetadataRetriever, ну мы его тоже использовать не будем, т.к. он для современных андроидов только, и с ним тащить в проект кучу чужого кода, библиотек и т.п. У нас же просто универсальная явовская прога, работающая на андроиде с 2.3 до современных независимо от марки и битности процессора.

Остается только проверить эти глюки MediaMetadataRetriever-а на более широком спектре телефонов и андроидов, и понять (хотя бы) до какой версии андроида проблема сохраняется (и до какой версии кадры могут быть статичные на протяжении всего видео или мусорные).

Проверка окна Video3GP2 (android) на тестовых телефонах

Возьмем четыре небольших видеофайла - два 3GP разных размеров (посмотрим как их криво открывает андроид и открывает ли нормально хоть на одной из версий андроида), один MP4 (снятый на samsung galaxy ace), один AVI с запаковкой кодеком Xvid (для проверки умеет ли хоть какой-нибудь андроид открывать Microsoft AVI-файлы):

Изображение

vgt1.3gp
Video: S263 128x96 12.5fps 51kbps [V: English [eng] (h263, yuv420p, 128x96, 51 kb/s)]
Изображение

vgt2.3gp
Video: S263 176x144 (4:3) 14.5fps 111kbps [V: English [eng] (h263, yuv420p, 176x144, 111 kb/s)]
Изображение

vgt3.mp4
Video: MPEG4 Video 640x480 23.73fps 1405kbps [V: VideoHandle [eng] (mpeg4 simple profile, yuv420p, 640x480, 1405 kb/s)]
Изображение

vgt4.avi
Video: Xvid 320x240 30fps 278kbps [V: mpeg4 advanced simple profile, yuv420p, 320x240, 278 kb/s]
Изображение

На андроиде - будем для каждого файла делать тесты:

1. Получаем один из результатов А, Б или В:
А) отлично: показывает много хороших кадров в зависимости от смещения по времени и, следовательно, дает выбрать один из них
Б) средненько: показывает один хороший статичный кадр, дополнительная проверка: есть ли мусор/битые/зеленые кадры при проигрывании или нет
В) всё плохо: не открылся файл с видео (сообщение про "не удалось...")

2. Проверка съемки кадра в PaintCAD (чтоб сразу на нем рисовать или обрабатывать эффектами)

3. Проверка съемки кадра в JPG-файл

4. Проверка съемки кадра в PNG-файл

1 - Android 2.3.3 - Samsung Galaxy Ace
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Статичный кадр.

Изображение

Дополнительная проверка: в некоторых местах по времени мусор на зеленом фоне, в некоторых просто зеленый фон

Изображение Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение Изображение

Файл vgt2.3gp

Тест 1 - Результат Б "средненько". Тоже статичный кадр.

Изображение

Дополнительная проверка: мусора нет, все видео - один и тот же кадр.

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt3.mp4

Тест 1 - Результат Б "средненько". Опять статичный кадр)

Изображение

Дополнительная проверка: мусора нет, все видео статичный кадр.

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt4.avi

Тест 1 - Результат Б "средненько". AVI с Xvid-кодеком открывается. Но показывает только первый статичный кадр

Изображение

Дополнительная проверка: мусора нет, все видео статичный кадр.

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение
Итог Samsung Galaxy Ace на Android 2.3.3:
- на этом телефоне андроид смог показать на 3GP/MP4-тестовых файлах только один кадр средствами MediaMetadataRetriever
- при открытии 3GP может появляться мусор в кадрах
- AVI-файл, запакованный кодеком Xvid, здесь тоже открывается, но показывает только один кадр

2 - Android 4.2 - RugGear RG310
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом мусор

Изображение

Дополнительная проверка: здесь мусор является движущимися изменяющимися фрагментами, которые надо бы рисовать поверх первого опорного кадра

Изображение Изображение

Неожиданно встречается второй опорный кадр!

Изображение

Потом опять идет мусор

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt2.3gp

Тест 1 - Результат Б "средненько". Тоже статичный кадр.

Изображение

Дополнительная проверка: мусора нет, все видео - один и тот же кадр. Это если включать воспроизведение и быстро запрашивать кадры.

А если вручную идти по 1 секунде, то на 10 и на 20 секундах телефон выдает еще пару опорных кадров:

Изображение

Изображение

Т.е. когда запрашиваешь кадры быстро - он берет из кеша какого-то и отправляет первый кадр. А если медленно идешь, вручную перебираешь кадры - то выдает опорные, встречающиеся посередине. Но между ними - отдает статичный кадр. С 0 по 10 секунд - первый кадр, с 10 по 20 секунд - второй кадр, с 20 секунд до конца видео - третий кадр. Промежуточные кадры между опорными отдавать не хочет ни при переборе кадров вручную, ни при автоматическом проигрывании.

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt3.mp4

Тест 1 - Результат Б "средненько". Статичный кадр

Изображение

Дополнительная проверка: мусора нет, все видео статичный кадр. Если медленно перебирать кадры, то иногда выдает второй опорный кадр.

Изображение

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

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt4.avi

Тест 1 - Результат Б "средненько". AVI с Xvid-кодеком тут тоже открывается. И опять показывает только первый статичный кадр

Изображение

Дополнительная проверка: мусора нет, все видео статичный кадр.

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение
Итог RugGear RG310 на Android 4.2:
- на этом телефоне андроид смог показать на 3GP/MP4-тестовых файлах несколько опорных кадров средствами MediaMetadataRetriever. Вероятно, он их медленно извлекает, поэтому при множественных частых запросах кадров показывает один и тот же кадр из кеша. Если же вручную медленно идти по кадрам, то он покажет и другие опорные кадры. Промежуточные между опорными кадры показывать не хочет
- при открытии 3GP мусор в виде движущихся изменяющихся частей кадров на черном фоне
- AVI-файл, запакованный кодеком Xvid, открывает, но показывает и дает извлечь только один статичный кадр на всей протяженности видео

3 - Android (Mocor) 4.4.4 - Joy's S15

На этом телефоне с андроидом 4.4.4 результаты очень похожи на предыдущий телефон с андроидом 4.2
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом мусор. Потом еще одиночный опорный кадр.

Изображение

Дополнительная проверка: здесь мусор, как и в андроиде 4.2 прошлого телефона, является движущимися изменяющимися фрагментами, которые надо бы рисовать поверх первого опорного кадра

Изображение

Неожиданно встречается второй опорный кадр!

Изображение

Потом опять идет мусор

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt2.3gp

Тест 1 - Результат Б "средненько". Тоже статичный кадр.

Изображение

Дополнительная проверка: мусора нет, все видео - один и тот же кадр. А если вручную идти по 1 секунде, то на 10 и на 20 секундах, как и на андроиде 4.2, телефон выдает еще пару опорных кадров:

Изображение

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt3.mp4

Тест 1 - Результат Б "средненько". Статичный кадр

Изображение

Дополнительная проверка: мусора нет, все видео статичный кадр. Если медленно перебирать кадры, то иногда выдает второй опорный кадр.

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt4.avi

Тест 1 - Результат Б "средненько". AVI с Xvid-кодеком тут тоже открывается. И опять показывает только первый статичный кадр

Изображение

Дополнительная проверка: есть мусор. Похож на тот, что появляется при проигрывании 3GP. Движущиеся меняющиеся объекты рисуются, остальное черное.

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение
Итог Joy's S15 на Android (Mocor) 4.4.4:
- на этом телефоне андроид смог показать на 3GP/MP4-тестовых файлах несколько опорных кадров средствами MediaMetadataRetriever. Как на предыдущем андроиде 4.2
- при открытии 3GP мусор в виде движущихся изменяющихся частей кадров на черном фоне, как на андроиде 4.2
- AVI-файл, запакованный кодеком Xvid, открывает, показывает много кадров, но только опорные полные кадры, остальные - рисует мусором из изменяющихся частей кадров на черном фоне

4 - Android 5.0.1 - Asus ZenFone 2

Для того чтобы понять какие андроиды с какими видеоформатами работают - пройдемся по разным версиям, которых не было в десятке тестовых устройств.

Это Asus ZenFone 2 - лопатка на андроиде 5.0.1 с экраном 720x1280 пикселей:

Изображение

Посмотрим как на андроиде 5 открываются различные видеоформаты для съемки кадров.
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом мусор. Потом еще одиночный опорный кадр.

Изображение

Дополнительная проверка: здесь мусор, как и в других андроидах, является движущимися изменяющимися фрагментами, которые надо бы рисовать поверх первого опорного кадра

Изображение

И опять виден второй опорный кадр

Изображение

Потом опять идет мусор

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt2.3gp

Тест 1 - Результат А "отлично". Этот 3GP отличается от предыдущего только размером по ширине и высоте. Но если в том были проблемы с мусором, то тут андроид проигрывает его на ура и достает кадры с любого смещения во времени.

Изображение

Изображение

Изображение

Изображение

Дополнительная проверка: мусора нет, все отлично

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt3.mp4

Тест 1 - Результат А "отлично". Все кадры достаются и проигрывание идет по ним гладко, без пустых кадров, без мусора

Изображение

Изображение

Дополнительная проверка: мусора нет

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt4.avi

Тест 1 - Результат В "всё плохо", AVI с Xvid-кодеком на этом андроиде 5.0.1 просто не открывается

Изображение
Итог Asus ZenFone 2 на Android 5.0.1:
- на этом телефоне андроид смог показать на мелком 3GP тестовом файле несколько опорных кадров средствами MediaMetadataRetriever, кроме двух опорных кадров остальные кадры с мусором
- но второй 3GP файл, размером побольше по ширине/высоте, проигрывается отлично и любые кадры можно достать
- третий, MP4 тестовый файл, проигрывается тоже отлично и достаются любые кадры
- AVI-файл, запакованный кодеком Xvid не хочет открывать (видимо, нет поддержки кодека Xvid или вообще поддержки AVI-файлов)

5 - Android 7.0 - Fly FS522 Cirrus 14

Этот Fly FS522 Cirrus 14 - еще один смартфон, на андроиде 7.0 с экраном 1080x1920 пикселей:

Изображение

Теперь посмотрим как на андроиде 7 открываются все эти видео.
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом мусор. Потом еще одиночный опорный кадр.

Изображение

Дополнительная проверка: здесь мусор, как и в других андроидах, является движущимися изменяющимися фрагментами, которые надо бы рисовать поверх первого опорного кадра

Изображение

И опять, как и на других телефонах, виден второй опорный кадр

Изображение

Потом опять мусор

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt2.3gp

Тест 1 - Результат Б "средненько". Одиночный статичный кадр, потом все меняется на следующем опорном кадре через 10 секунд и еще через 10 секунд еще раз на одном опорном кадре

Изображение

Изображение

Изображение

Дополнительная проверка: мусора нет, в этом плане все отлично

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt3.mp4

Тест 1 - Результат Б "средненько". Одиночный статичный кадр, потом все меняется на следующем опорном кадре

Изображение

Изображение

Изображение

Изображение

Дополнительная проверка: мусора нет

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt4.avi

Тест 1 - Результат Б "средненько". Одиночный статичный кадр, AVI с Xvid-кодеком здесь открывается, но кадров кроме самого первого не показывает

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение
Итог Fly FS522 Cirrus 14 на Android 7.0:
- на этом телефоне андроид смог показать на мелком 3GP тестовом файле несколько опорных кадров средствами MediaMetadataRetriever, кроме двух опорных кадров остальные кадры с мусором
- второй 3GP файл, размером побольше по ширине/высоте, тоже показывает только опорные кадры, между ними статичные предыдущие опорные кадры
- третий, MP4 тестовый файл, показывает тоже только опорные кадры (они где-то раз в секунду в видео лежат, вот каждую секунду изображение и меняется), промежуточные кадры не показывает
- AVI-файл, запакованный кодеком Xvid открывает, но показывает только один статичный кадр на все видео

6 - Android 9 - Soyes XS13
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом сразу же второй одиночный (который обычно на 12 секундах стоял на других телефонах)

Изображение

Изображение

Дополнительная проверка: здесь мусор из движущихся фрагментов после второго опорного кадра (т.е. после 12 секунд)

Изображение

И потом этот мусор идет до самого конца ролика

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt2.3gp

Тест 1 - Результат А "отлично". Все кадры достаются и проигрывание идет по ним

Изображение Изображение Изображение

Дополнительная проверка: мусора нет, в этом плане все отлично

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt3.mp4

Тест 1 - Результат А "отлично". Тоже все кадры достаются и проигрывание идет по ним

Изображение Изображение

Дополнительная проверка: мусора нет

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение

Файл vgt4.avi

Тест 1 - Результат А "отлично". Обнаружен телефон, отлично проигрывающий AVI с кодеком Xvid! и достающий все кадры =)

Изображение Изображение Изображение Изображение Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение Изображение
Итог Soyes XS13 на Android 9:
- на этом телефоне андроид смог показать на мелком 3GP тестовом файле несколько опорных кадров средствами MediaMetadataRetriever, кроме двух опорных кадров и по прошествии второго кадра (отметка по времени 12 секунд) остальные кадры - с мусором
- второй 3GP файл, размером побольше по ширине/высоте, отлично проигрывается и любые кадры достаются
- третий, MP4 тестовый файл, тоже отлично проигрывается и любые кадры достаются
- AVI-файл, запакованный кодеком Xvid открывается, проигрывается и любые кадры достаются

7 - Android 11 - Xiaomi Redmi Note 8 Pro

Это телефон на Android 11, разрешение экрана 1080x2340. Результаты очень похожи на предыдущий Android 8.
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом мусор, потом второй одиночный на 12 секундах, потом опять мусор

Изображение

Изображение

Дополнительная проверка: здесь мусор между опорными кадрами 0 с и 12 с

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt2.3gp

Тест 1 - Результат А "отлично". Все кадры достаются и проигрывание идет по ним

Изображение

Изображение

Дополнительная проверка: мусора нет, в этом плане все отлично

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt3.mp4

Тест 1 - Результат А "отлично". Тоже все кадры достаются и проигрывание идет по ним

Изображение

Изображение

Дополнительная проверка: мусора нет

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt4.avi

Тест 1 - Результат А "отлично". Обнаружен еще один телефон, проигрывающий AVI с кодеком Xvid! и достающий все кадры

Изображение

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение
Итог Xiaomi Redmi Note 8 Pro на Android 11:
- на этом телефоне андроид смог показать на мелком 3GP тестовом файле несколько опорных кадров средствами MediaMetadataRetriever, кроме двух опорных кадров (0 c и 12 с) остальные кадры - с мусором
- второй 3GP файл, размером побольше по ширине/высоте, отлично проигрывается и любые кадры достаются
- третий, MP4 тестовый файл, тоже отлично проигрывается и любые кадры достаются
- AVI-файл, запакованный кодеком Xvid открывается, проигрывается и любые кадры достаются

8 - Android 12 - Xiaomi Duoqin F22 Pro
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом мусор, потом второй одиночный на 12 секундах, потом опять мусор

Изображение

Изображение

Дополнительная проверка: здесь мусор между опорными кадрами 0 с и 12 с

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt2.3gp

Тест 1 - Результат А "отлично". Все кадры достаются и проигрывание идет по ним

Изображение

Изображение

Изображение

Дополнительная проверка: мусора нет, в этом плане все отлично

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt3.mp4

Тест 1 - Результат А "отлично". Тоже все кадры достаются и проигрывание идет по ним

Изображение

Изображение

Изображение

Дополнительная проверка: мусора нет

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt4.avi

Тест 1 - Результат В "всё плохо". В этом андроиде 12 поддержку AVI с Xvid-кодеком вырезали, видимо. Может быть, это только на этом устройстве

Изображение
Итог Xiaomi Duoqin F22 Pro на Android 12:
- на этом телефоне андроид смог показать на мелком 3GP тестовом файле несколько опорных кадров средствами MediaMetadataRetriever, кроме двух опорных кадров (0 c и 12 с) остальные кадры - с мусором
- второй 3GP файл, размером побольше по ширине/высоте, отлично проигрывается и любые кадры достаются
- третий, MP4 тестовый файл, тоже отлично проигрывается и любые кадры достаются
- AVI-файл, запакованный кодеком Xvid - не открывается

9 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)
Посмотреть скриншотыПоказать
Файл vgt1.3gp

Тест 1 - Результат Б "средненько". Одиночный кадр, потом мусор (зеленого цвета!), потом второй одиночный на 12 секундах, потом опять мусор

Изображение

Изображение

Дополнительная проверка: здесь мусор между опорными кадрами 0 с и 12 с

Изображение

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt2.3gp

Тест 1 - Результат А "отлично". Все кадры достаются и проигрывание идет по ним

Изображение

Изображение

Изображение

Дополнительная проверка: мусора нет, в этом плане все отлично

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt3.mp4

Тест 1 - Результат А "отлично". Тоже все кадры достаются и проигрывание идет по ним

Изображение

Изображение

Изображение

Дополнительная проверка: мусора нет

Тест 2 - Съемка кадра в PaintCAD работает

Изображение

Тест 3 - Съемка кадра в файл работает и в формате JPG, и в формате PNG

Изображение

Изображение

Файл vgt4.avi

Тест 1 - Результат В "всё плохо". AVI с кодеком Xvid не открывает этот андроид 15

Изображение
Итог Xiaomi Redmi Turbo 3 (Poco F6) на Android 15:
- на этом телефоне андроид смог показать на мелком 3GP тестовом файле несколько опорных кадров средствами MediaMetadataRetriever, кроме двух опорных кадров (0 c и 12 с) остальные кадры - с мусором зеленого цвета
- второй 3GP файл, размером побольше по ширине/высоте, отлично проигрывается и любые кадры достаются
- третий, MP4 тестовый файл, тоже отлично проигрывается и любые кадры достаются
- AVI-файл, запакованный кодеком Xvid не открывается

В итоге

Все андроиды поддерживают совершенно разные типы файлов и кодеков) Будет неудивительно, что если взять три телефона с одной и той же версией андроида - то они, наверное, будут по разному поддерживать/не поддерживать разные форматы в MediaMetadataRetriever, хоть андроид один и тот же. Все, скорее всего, зависит от того поддержку чего впихнул в андроид производитель телефона.

Ява-версию окошка Video3GP налаживать пока не будем, строчки внизу окна выровняли в рамках масштабирования. Ее и на сименсах не проверить толком (эмуляторы ведут себя не так, как телефоны, видео грузят, снимки не делают, видимо, какой-нибудь памяти не хватает чтоб запаковать и скинуть в JPG кадр), а на нокии N90 она не грузит файл (вообще не пытается, видимо никогда и не грузила, т.к. отладка была только на сименсах, как и тесты на настоящих устройствах). Позже надо будет почитать как же работать с видеоплеером под j2me и разобраться почему она не грузит и как оно должно работать.

А на андроидах все работает хорошо. Хотя бы в пределах поддерживаемых андроидом форматов на каждом устройстве.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей