Автор Тема: Извлечение мультимедиа (звук, видео, музыка) данных из игр CD/DVD приставок  (Прочитано 448871 раз)

0 Пользователей и 7 Гостей просматривают эту тему.

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Что мешает установить новый PIL к новому Python через pip?

Мешает куча установленных библиотек из разных источников которых придётся перестанавливать а пользы мне от нового Python не будет больше мороки, возможно некоторые скрипты перестанут работать.
--------
На будущее, это:
print(HEX_byte(b"test_string"))
Заменяется на:
print(b"test_string".hex(' ').upper())

У меня это вызывает ошибку AttributeError: 'bytes' object has no attribute 'hex'
« Последнее редактирование: 04 Ноябрь 2019, 08:04:28 от Zetper »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
Zetper, Veshurik то в этом не виноват, не советуйте плохого.
--------
Проверил в Python 3.8.0 и последнем Pillow, всё работает. Отлично.
« Последнее редактирование: 03 Ноябрь 2019, 22:28:54 от Sharpnull »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
Zetper, вы забыли прозрачность. PIL не имеет работать с индексированными изображениями с альфа-прозрачностью, но такие существуют. Нужно сохранять в PNG32. Исправил ваш код.
P.S. Код не оптимальный, знаю, взял кусок из моего старого скрипта.
« Последнее редактирование: 03 Ноябрь 2019, 23:14:25 от Sharpnull »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2432
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
не удержался, чтобы опять не вставить свой взгляд со стороны :) а накой козе боян? питоны, потом какие-то дополнительные приблуды к нему, потом скрипты к питону... эээм... не кажется ли вам, что все это несколько сложновато для понимания и тем более применения? не проще ли было бы для пользователей увидеть одну ехешку, в которой все эти танцы с бубном уже запиханы? которая будет работать, не зависимо от того есть ли питон в системе, новый, или старый, и есть ли к нему приблуды и есть ли скрипт.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
SeregaZ, есть такая штука, в Python называется freezing (https://docs.python-guide.org/shipping/freezing/), суёт питон и всё что нужно. Весит несколько мегабайт. Но лучше пусть человек поставит Python, это полезно для развития и пригодится.

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Zetper, вы забыли прозрачность. PIL не имеет работать с индексированными изображениями с альфа-прозрачностью, но такие существуют. Нужно сохранять в PNG32. Исправил ваш код.
P.S. Код не оптимальный, знаю, взял кусок из моего старого скрипта.
Не сделал прозрачность по причине того что в формате Tim2 используется свой тип прозрачности и если его на прямую записать то прозрачность не правильно получится. Если ты знаешь точно как это сделать правильно конвертировать прозрачность Tim2 это хорошо  ;) я не против.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
Если ты знаешь точно как это сделать правильно конвертировать прозрачность Tim2 это хорошо  ;) я не против.
Про Tim2 точно не уверен, но вроде правильно. Просто уже конвертировал у Silent Hill 2 [PS2], а это кажется на уровне железа или софта, что 0x80 - полная непрочность, 0x00 - полная прозрачность.
def scale_alpha(a):
    return int(min(255.0 * (a / 128.0), 0xFF))
def unscale_alpha(a):
    return int(min(math.ceil(128.0 * (a / 255.0)), 0x80))
В каком-то софте по разбору ресурсов почти такое же видел.
--------

Оптимизировал предыдущий код от Zetper, в котором добавил прозрачность, теперь вместо 15 минут обработка идёт 9 минут, без прозрачности работало за 5 минут 20 секунд.
Помогло использование кортежей для палитры и передача целой последовательности пикселей в PIL.
« Последнее редактирование: 04 Ноябрь 2019, 07:53:55 от Sharpnull »

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Sharpnull я переписал кусок кода теперь конвертация всех картинок с альфа-прозрачностью заместо 21 минуты будет занимать 16 минут.

Скрипт https://yadi.sk/d/qxOSrwwI7MP13Q

Veshurik можешь пользоваться это версией, но не забудь установить Pillow выше я об этом писал.

Оффлайн Veshurik

  • Пользователь
  • Сообщений: 8
    • Просмотр профиля
Скачал скрипт, запихал .tx1 в одну папку, рядом запустил скрипт... Окошко открывается и сразу закрывается. Папка Unpack появляется, но в ней пусто.

Python 3.4.3 установлен по папке Python34 (вес папки 80Мб), а Pillow 4.1.1win32 скачивал и устанавливал по ссылке ранее. Без понятия, что не так.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
Sharpnull я переписал кусок кода теперь конвертация всех картинок с альфа-прозрачностью заместо 21 минуты будет занимать 16 минут.
Забавно, что вы выложили через 10 минут после меня оптимизацию. Моя оптимизация всё равно быстрее 9 минут вместо 11 с половиной вашей, на моём компьютере.

Veshurik, запустите через командную строку и напишите текст с ошибкой.
--------
Zetper, на счёт скорости. Можно распараллелить. Попробовал тупо разделить файлы на 2 папки и запустить 2 скрипта, оба закончили примерно за 4:30.
На счёт версий Python. Недавно узнал про pipenv, который умеет создавать виртуальные среды любых версий и пакетов и работать с ними отдельно, не засоряя основную установку. https://docs.python-guide.org/dev/virtualenvs/
« Последнее редактирование: 04 Ноябрь 2019, 22:31:59 от Sharpnull »

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Sharpnull Я не заметил обновления твоего комментария, сможешь увеличить скорость распаковки сжатия ? мне интересно твоё программное решение этого вопроса. Спасибо за твою вариацию скрипта. Если Veshurik использовал твой скрипт он у него не запустится по причине строчки HEX = unclear.hex(' ').upper() на python-3.4.3 она выдаст ошибку.

Veshurik Ты менял пути при установки Python или Pillow ? если не менял должно быть всё в порядке.
Скачивал этот скрипт https://yadi.sk/d/qxOSrwwI7MP13Q ?
Попробуй скрипт переименовать в 1.py скачать https://yadi.sk/d/PLyf5gHkkx4yiQ кинуть в папку со скриптом и файлами .1tex и запустить 1.bat скопируй текст из него и выложить тут.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
HEX = unclear.hex(' ').upper() на python-3.4.3 она выдаст ошибку.
Ох, и правда "New in version 3.5.".
Я не заметил обновления твоего комментария, сможешь увеличить скорость распаковки сжатия ?
Так и подумал, нужно было отдельно добавлять, я по привычке обновляю последний. Не смогу. По-хорошему нужно профилировать тот код, может он не медленный. Проще распараллелить.
Собрал скрипт в exe, чтобы без Python работал. Не буду здесь мусорить, выложу на хостинг: https://www36.zippyshare.com/v/NCCenlCw/file.html
С Python 3.8.0 проблема в том, что cx_Freeze и PyInstaller не обновили, для установки PyInstaller нужно использовать develop версию: pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz
--------
Использовал https://docs.python.org/3.8/library/multiprocessing.html, первый пример :) Загрузил все 4 ядра на 100%, управился за  0:02:42:
from multiprocessing import Pool

def main():
    if os.path.exists(path+"\\Unpack") == False:
        os.makedirs(path+"\\Unpack")
    with Profiler() as p:
        files = []
        for mult_file in os.listdir(path):
            if mult_file.lower().endswith(('.1tex')):
                files.append(mult_file)
        with Pool(5) as p:
            p.map(Unpack, files)
    print("Закрыть")
Для двух потоков (ядер) нужно конечно Pool(2) делать.
« Последнее редактирование: 05 Ноябрь 2019, 00:08:15 от Sharpnull »

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
--------
Использовал https://docs.python.org/3.8/library/multiprocessing.html, первый пример :) Загрузил все 4 ядра на 100%, управился за  0:02:42:
from multiprocessing import Pool

def main():
    if os.path.exists(path+"\\Unpack") == False:
        os.makedirs(path+"\\Unpack")
    with Profiler() as p:
        files = []
        for mult_file in os.listdir(path):
            if mult_file.lower().endswith(('.1tex')):
                files.append(mult_file)
        with Pool(5) as p:
            p.map(Unpack, files)
    print("Закрыть")
Для двух потоков (ядер) нужно конечно Pool(2) делать.

Спасибо за ценную информацию это мне пригодится  :thumbup:

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
Zetper, всё-таки оптимизировал расшифровку. Теперь обработка за 5 минут вместо 9, а при 4 потоках за 00:01:24 вместо 00:02:42. 0_0 Проблема в чтении по одному байту:
    back = struct.unpack("B",f.read(1))[0] +1 # Насколько байт отойти назад
    posf = f2.tell() - back # Позиция чтения
    for j3 in range(col): # Сколько прочитать байт
        f2.seek(posf) # Переход на нужное место
        fd = f2.read(1) # Читаем байт
        f2.seek(0,2) # Перейти в конец файла
        f2.write(fd) # Запись байта
        posf += 1
Вот так быстрее:    back = f.read(1)[0] + 1 # Насколько байт отойти назад
    posf = f2.tell() - back # Позиция чтения

    f2.seek(posf)
    fd = f2.read(back)
    f2.seek(0, io.SEEK_END)
    f2.write((fd * (col//back+1))[:col])
Так как байты циклически повторяются, то я просто дублирую их. Например 123 записать 5 байт: 123 * ((5//3) + 1) == 123123 и отсекаем лишнее 12312. Там бывают последовательности длиной 100 по 1 байту, поэтому быстрее.
Добавил в скрипт выбор количества потоков (хотя там процессы) через первый аргумент, по умолчанию 1.
Заменил unclear.hex(' ').upper() на hexlify(unclear, ' ').upper().decode() для вывода hex значений из модуля binascii, который существует ещё с Python 2.

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Sharpnull Спасибо за ускорение, строчка hexlify(unclear, ' ').upper().decode() снова вызывает ошибку пишет что второй аргумент лишний TypeError: hexlify() takes exactly 1 argument (2 given) без , ' ' работает но слитно получается строчка. В принципе эти байты можно пропустить и не отображать они всё ровно не несут полезной информации.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
hexlify(unclear, ' ').upper().decode() снова вызывает ошибку пишет что второй аргумент лишний TypeError: hexlify() takes exactly 1 argument (2 given)
Я опять не прочитал "Changed in version 3.8: The sep and bytes_per_sep parameters were added." и поднял требуемую версию c Python 3.5 до 3.8. :)
Получается до Python 3.5 приходится такие костыли писать:
>>> " ".join(hex(x)[2:] for x in b'123_xyz').upper()
'31 32 33 5F 78 79 7A'
--------
Пример выше с ошибкой. Нужно так:
>>> " ".join("{:02x}".format(x) for x in b'\x00123_xyz').upper()
'00 31 32 33 5F 78 79 7A'
« Последнее редактирование: 05 Ноябрь 2019, 13:13:00 от Sharpnull »

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4392
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
Заведите уже себе репозиторий и пуляйте туда коммиты.

Оффлайн Veshurik

  • Пользователь
  • Сообщений: 8
    • Просмотр профиля
Всё извлеклось, в общем, после того как мне скинули ещё раз файлы, спасибо.

Поразительно, что среди извлечённого контента оказались 18+ сцены, хотя в самой игре они порезаны (не показываются либо отображаются с масштабированием).
Видимо, думали, что Sony разрешит, но что-то не пошло.

Я также не ожидал, что качество картинки на PS2 играх настолько низкое, даже ниже, чем на ПК-играх того времени (2010-е годы).
640х448 это прямо боль.

С игровым текстом всё сложнее, насколько я понимаю?

====

И да, кто-нибудь знает, куда сохраняются файлы сохранений игры на эмуляторе? PCSX2. Именно вот общее сохранение игры, а не те внутренние в слотах по выбору.
« Последнее редактирование: 05 Ноябрь 2019, 16:52:31 от Veshurik »

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
И да, кто-нибудь знает, куда сохраняются файлы сохранений игры на эмуляторе? PCSX2. Именно вот общее сохранение игры, а не те внутренние в слотах по выбору.
Veshurik
Быстрые сохранения Savestate в pcsx2\sstates с расширением .p2s
Сохранения вовремя самой игры в на файлах карточках pcsx2\memcards с расширением .ps2

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Veshurik Насчёт остальных файлов игры

Файл 0272742400.bin похоже на звук vag в конце есть кусок данных размером в 576 байт, файл можно просканировать PSound 2.0 и послушать звуки.
Файл 0272769024.bin непонятно похоже читается по 2 байта.

К файлам которые я описал ниже я сделал скрипт конвектор он вынимает всё что я смог определить.

В файле 0269828096.bin есть одна картинка.
Файл 1423173632 Картинка.T2 это не сжатая картинка.
Файлы 0274896896.bin, 0277442560.bin, 0279988224.bin это шрифты игры, палитры в файле нет.
Файлы 0282533888.bin, ioprp310.img, SLPM_552.63, SYSTEM.CNF в них есть немного программного английского текста, сам текст из файлов я вырываю так что там попадается мусор.

Файл 0269934592 Сжатый файл.1BIN это сжатый файл извините за тавтологию :blush: я его сейчас просто распаковываю, он содержит в себе байт код команд для игры вперемешку с японским текстом.
Сам байт код это определённы байтовые команды которые говорят игровому движку что делать например какую картинку персонажа показать, какой фон отобразить, запустить музыку или голос персонажа, сделать плюс к симпатии одного персонажа или же минус, сюжетные развилки, и ещё кучей всего и под каждое определённое действие отведено определённая команда.

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

В папку со скриптом кидай файлы 0274896896.bin, 0277442560.bin, 0279988224.bin, 0269828096.bin, 1423173632 Картинка.T2, 0282533888.bin, ioprp310.img, SLPM_552.63, SYSTEM.CNF, 0269934592 Сжатый файл.1BIN и запускай скрипт дождись пока появится надпись Закрыть файлы появится в папке Unpack.
Названия игровых файлов не меняй я к названиям привязал запуск определённого кода конвертации файлов.

------------------------------------

Добавлено позже:

Обновил скрипт теперь он выдирает японский текст из файла, там получилось 41377 строк текста советую открывать текстовый файл в Notepad++ он его откроет быстрей чем виндовсовский блокнот. В папке Unpack ещё появится файл "0269934592 Удалил весь известный текст.00" это по сути тодже самый байт код файл просто я из него удалил весь найденный текст, если там что-то и осталось из не найденных строк можно посмотреть в нём hex редактором.

Скрипт https://yadi.sk/d/3MUgVEaGY9wltw
« Последнее редактирование: 06 Ноябрь 2019, 08:45:52 от Zetper »

Оффлайн Veshurik

  • Пользователь
  • Сообщений: 8
    • Просмотр профиля
Ничего себе гигантская новелла просто, ~42к строчек текста.

Спасибо большое за работу! Скажите, а эти скрипты могут подойти и для других новелл на PS2, где расширение точно такое же у файлов?

Оффлайн Zetper

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Ничего себе гигантская новелла просто, ~42к строчек текста.

Спасибо большое за работу! Скажите, а эти скрипты могут подойти и для других новелл на PS2, где расширение точно такое же у файлов?
Нет скорей всего.

Оффлайн UsernoName

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
« Последнее редактирование: 04 Декабрь 2019, 05:01:57 от UsernoName »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
UsernoName, игру, платформу, регион, образ укажите.

Оффлайн UsernoName

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
« Последнее редактирование: 04 Декабрь 2019, 05:02:08 от UsernoName »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
сделать перевод.
На какой язык? Для PS2 уже есть русская версия.

Оффлайн UsernoName

  • Пользователь
  • Сообщений: 15
    • Просмотр профиля
Sharpnull, на русский, для wii. Что есть русский для Ps2 не знал.

Оффлайн Golk

  • Пользователь
  • Сообщений: 158
    • Просмотр профиля
Кто-то может помочь профану использовать это по назначению?
https://github.com/ToadKing/sbs_extractor
Хотелось бы попытаться вытащить эмбиенты из различных еа игр до frostbite эры.
Архив https://dropmefiles.com/nXTNe

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4842
    • Просмотр профиля
Golk, sbs_extractor.c компилируется с помощью MinGW или Visual Studio. При обработке ваших файлов ошибка:
saving ambience/0x20C4C363.snu
sample count mismatch (got 4937582, expected 541808494)failed: 10
Придётся поискать другой извлекатель.
Вот sbs_extractor.exe, если что.
--------
Похоже https://github.com/losnoco/vgmstream поддерживает: https://github.com/losnoco/vgmstream/blob/master/src/meta/ea_eaac.c. Только я не умею им пользоваться.
--------
Разобрался немного. Отсюда качать test.zip.
Если запустить так:
test.exe -i -o file.wav ambience.sbrТо будет длиной 1:51:
sample rate: 44100 Hz
channels: 4
looping: disabled
loop start: 0 samples (0:00.000 seconds)
loop end: 4937582 samples (1:51.963 seconds)
stream total samples: 4937582 (1:51.963 seconds)
encoding: Electronic Arts EA-XAS 4-bit ADPCM v1
layout: blocked (EA SNS)
metadata from: Electronic Arts SNR+SNS header
bitrate: 841 kbps
stream count: 6
stream index: 1
samples to play: 4937582 (1:51.963 seconds)
Если просто test.exe -o file.wav ambience.sbr, то будет в 2 раза длиннее, повтор идёт, а -i как раз предотвращает looping.
--------
Там 6 треков (видно по stream count: 6), так что нужно для каждого вызывать:
test.exe -i -s 1 -o file1.wav ambience.sbr
...
test.exe -i -s 6 -o file6.wav ambience.sbr
Или использовать bat-файл, как там и показано: https://github.com/losnoco/vgmstream#components.
--------
Можно установить их плагин для foobar2000 https://www.foobar2000.org/components/view/foo_input_vgmstream, тогда после добавления ambience.sbr отобразятся все 6 треков, их можно послушать или сконвертировать. Только они отображаются с повтором (2 раза длиннее).
--------
Кстати, sbs_extractor похоже распаковал правильно, но только один трек. При использовании ToWav Music Converter для SNU -> WAV, программа разделяет 4 канала на два файла, а vgmstream все 4 канала пишет в один WAV-файл, это стоит учитывать.
--------
Если в sbs_extractor убрать несоответствие как ошибку, то все треки извлекутся:
if (numsamples != (shead.samples & ~0x40000000U))
{
printf("sample count mismatch (got %u, expected %u)", numsamples, (shead.samples & ~0x40000000U));
//r = 10;
//goto error;
}
Добавил эту версию (sbs_extractor_ignore_mismatch.7z).
« Последнее редактирование: 07 Апрель 2020, 14:28:48 от Sharpnull »

Оффлайн Golk

  • Пользователь
  • Сообщений: 158
    • Просмотр профиля
Sharpnull, Спасибо тебе, добрый человек за подробный разбор!