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

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5608
    • Просмотр профиля
ffmpeg почему-то сжимает качество видео при обработке.
Потому что нужно задать настройки, по умолчанию качество среднее. На самом деле, вам нужно только аудио перекодировать, видео везде воспроизводится. Уже обсуждали к переводу Rainbow Cotton программу SFDMUX, ей разделить на видео и аудио, перекодировать аудио и назад совместить.

Если хотите в h264, https://trac.ffmpeg.org/wiki/Encode/H.264.
Быстро / большой файл:
ffmpeg -i input -c:v libx264 -preset ultrafast -crf 0 output.mkvМедленно / маленький файл:
ffmpeg -i input -c:v libx264 -preset veryslow -crf 0 output.mkvНаверно ещё надо будет для аудио установить.
--------
Вот про разделение: http://www.emu-land.net/forum/index.php/topic,82378.msg1407588.html#msg1407588
Но она здесь не нужна и разделение тоже, попутал. Попробуйте так:
ffmpeg -i input.sfd -c:v copy output.mpgВидео будет как было без конвертации. Нужно посмотреть как аудио настраивать, чтобы качество сделать получше.
--------
Заметил, что в извлечённых файлах при помощи скрипта от Zetper файлов музыки там нет... То есть, там нет вообще file000...
Просто до 1731166208.ADX
Это и есть музыка, у меня то другие имена были.
« Последнее редактирование: 03 Ноябрь 2019, 17:59:45 от Sharpnull »

Оффлайн Veshurik

  • Пользователь
  • Сообщений: 8
    • Просмотр профиля
Спасибо, получилось с помощью кода для ffmpeg с видео.
Аудио вроде и так хорошее в нём, в настройках написано, что стерео 384кбит.

А-а, вы имели в виду аудиофайлы именно. Они весят по 5-6Мб, наверное, это MP3, но точно не WAV.
UPD. Посмотрел по Spek, там график уходит далеко за границы... наверное, всё же WAV? 1536кбит...
« Последнее редактирование: 03 Ноябрь 2019, 18:39:19 от Veshurik »

Оффлайн Zetper

  • Пользователь
  • Сообщений: 84
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Veshurik я написал распаковщик сжатия и конвертации картинок с начало надо установить Pillow для работы с графикой в Python  https://files.pythonhosted.org/packages/7d/06/287ee4b3744d3d4c7657c657d8e59bb556e48a79cf7485c7d4cd926cd42c/Pillow-4.1.1.win32-py3.4.exe надеюсь ты не менял пути установки Python (Этот Pillow подходит к версии Python которую я кидал по ссылке).

Скидываешь все файлы с расширением .1tex в папку со скриптом и запускаешь его, если сделал всё правильно побегут имена файлов. Время распаковки всех файлов занимает примерно 8 минут дождись пока появится надпись Закрыть. Рядом появится папка Unpack в ней будут картинки .png

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

Из интересного
По сжатию это разновидность RLE на его разбор ушло 1 час 30 минут.
В одном файле .1tex может быть по несколько картонок.
Не думал что на PS2 официально выпускали хентай игры.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5608
    • Просмотр профиля
надо установить Pillow для работы с графикой в Python  https://files.pythonhosted.org/packages/7d/06/287ee4b3744d3d4c7657c657d8e59bb556e48a79cf7485c7d4cd926cd42c/Pillow-4.1.1.win32-py3.4.exe надеюсь ты не менял пути установки Python (Этот Pillow подходит к версии Python которую я кидал по ссылке).
Что мешает установить новый PIL к новому Python через pip? В консоли:
pip install -U pillow
Добавлено позже:
На будущее, это:
def HEX_byte(byte): # Переделавает строчку байт в нормальный вид b'd;\x00\x00' в 64 3b 00 00
    HEX = ""
    for elem in byte:
        HEX += hex(elem)[2:].rjust(2, '0') + " "
    HEX = HEX.upper() # Преобразование строки к верхнему регистру
    return (HEX)

print(HEX_byte(b"test_string"))
Заменяется на:
print(b"test_string".hex(' ').upper())
« Последнее редактирование: 03 Ноябрь 2019, 21:57:01 от Sharpnull »

Оффлайн Zetper

  • Пользователь
  • Сообщений: 84
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
Что мешает установить новый 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

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

Оффлайн Sharpnull

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

Оффлайн SeregaZ

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

Оффлайн Sharpnull

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

Оффлайн Zetper

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5608
    • Просмотр профиля
Если ты знаешь точно как это сделать правильно конвертировать прозрачность 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

  • Пользователь
  • Сообщений: 84
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
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

  • Пользователь
  • Сообщений: 5608
    • Просмотр профиля
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

  • Пользователь
  • Сообщений: 84
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
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

  • Пользователь
  • Сообщений: 5608
    • Просмотр профиля
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

  • Пользователь
  • Сообщений: 84
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
--------
Использовал 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

  • Пользователь
  • Сообщений: 5608
    • Просмотр профиля
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

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5608
    • Просмотр профиля
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

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

Оффлайн Veshurik

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

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

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

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

====

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

Оффлайн Zetper

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

Оффлайн Zetper

  • Пользователь
  • Сообщений: 84
  • Пол: Мужской
  • Потерянный в пустоте
    • ВКонтакте
    • Просмотр профиля
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

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

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

Оффлайн UsernoName

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

Оффлайн Sharpnull

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

Оффлайн UsernoName

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

Оффлайн Sharpnull

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