| Разработка и ромхакинг > Ромхакинг |
| Извлечение мультимедиа (звук, видео, музыка) данных из игр CD/DVD приставок |
| << < (91/101) > >> |
| Sharpnull:
--- Цитата: Veshurik от 03 Ноябрь 2019, 17:27:27 ---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 --- Конец кода --- Видео будет как было без конвертации. Нужно посмотреть как аудио настраивать, чтобы качество сделать получше. -------- --- Цитата: Veshurik от 03 Ноябрь 2019, 17:27:27 ---Заметил, что в извлечённых файлах при помощи скрипта от Zetper файлов музыки там нет... То есть, там нет вообще file000... Просто до 1731166208.ADX --- Конец цитаты --- Это и есть музыка, у меня то другие имена были. |
| Veshurik:
Спасибо, получилось с помощью кода для ffmpeg с видео. Аудио вроде и так хорошее в нём, в настройках написано, что стерео 384кбит. А-а, вы имели в виду аудиофайлы именно. Они весят по 5-6Мб, наверное, это MP3, но точно не WAV. UPD. Посмотрел по Spek, там график уходит далеко за границы... наверное, всё же WAV? 1536кбит... |
| Zetper:
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:
--- Цитата: Zetper от 03 Ноябрь 2019, 21:33:59 ---надо установить 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()) --- Конец кода --- |
| Zetper:
--- Цитата: Sharpnull от 03 Ноябрь 2019, 21:47:53 ---Что мешает установить новый PIL к новому Python через pip? --- Конец цитаты --- Мешает куча установленных библиотек из разных источников которых придётся перестанавливать а пользы мне от нового Python не будет больше мороки, возможно некоторые скрипты перестанут работать. -------- --- Код: ---На будущее, это: print(HEX_byte(b"test_string")) Заменяется на: print(b"test_string".hex(' ').upper()) --- Конец кода --- У меня это вызывает ошибку AttributeError: 'bytes' object has no attribute 'hex' |
| Sharpnull:
Zetper, Veshurik то в этом не виноват, не советуйте плохого. -------- Проверил в Python 3.8.0 и последнем Pillow, всё работает. Отлично. |
| Sharpnull:
Zetper, вы забыли прозрачность. PIL не имеет работать с индексированными изображениями с альфа-прозрачностью, но такие существуют. Нужно сохранять в PNG32. Исправил ваш код. P.S. Код не оптимальный, знаю, взял кусок из моего старого скрипта. |
| SeregaZ:
не удержался, чтобы опять не вставить свой взгляд со стороны :) а накой козе боян? питоны, потом какие-то дополнительные приблуды к нему, потом скрипты к питону... эээм... не кажется ли вам, что все это несколько сложновато для понимания и тем более применения? не проще ли было бы для пользователей увидеть одну ехешку, в которой все эти танцы с бубном уже запиханы? которая будет работать, не зависимо от того есть ли питон в системе, новый, или старый, и есть ли к нему приблуды и есть ли скрипт. |
| Sharpnull:
SeregaZ, есть такая штука, в Python называется freezing (https://docs.python-guide.org/shipping/freezing/), суёт питон и всё что нужно. Весит несколько мегабайт. Но лучше пусть человек поставит Python, это полезно для развития и пригодится. |
| Zetper:
--- Цитата: Sharpnull от 03 Ноябрь 2019, 23:05:54 ---Zetper, вы забыли прозрачность. PIL не имеет работать с индексированными изображениями с альфа-прозрачностью, но такие существуют. Нужно сохранять в PNG32. Исправил ваш код. P.S. Код не оптимальный, знаю, взял кусок из моего старого скрипта. --- Конец цитаты --- Не сделал прозрачность по причине того что в формате Tim2 используется свой тип прозрачности и если его на прямую записать то прозрачность не правильно получится. Если ты знаешь точно как это сделать правильно конвертировать прозрачность Tim2 это хорошо ;) я не против. |
| Sharpnull:
--- Цитата: Zetper от 03 Ноябрь 2019, 23:36:14 ---Если ты знаешь точно как это сделать правильно конвертировать прозрачность 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. |
| Zetper:
Sharpnull я переписал кусок кода теперь конвертация всех картинок с альфа-прозрачностью заместо 21 минуты будет занимать 16 минут. Скрипт https://yadi.sk/d/qxOSrwwI7MP13Q Veshurik можешь пользоваться это версией, но не забудь установить Pillow выше я об этом писал. |
| Veshurik:
Скачал скрипт, запихал .tx1 в одну папку, рядом запустил скрипт... Окошко открывается и сразу закрывается. Папка Unpack появляется, но в ней пусто. Python 3.4.3 установлен по папке Python34 (вес папки 80Мб), а Pillow 4.1.1win32 скачивал и устанавливал по ссылке ранее. Без понятия, что не так. |
| Sharpnull:
--- Цитата: Zetper от 04 Ноябрь 2019, 08:04:03 ---Sharpnull я переписал кусок кода теперь конвертация всех картинок с альфа-прозрачностью заместо 21 минуты будет занимать 16 минут. --- Конец цитаты --- Забавно, что вы выложили через 10 минут после меня оптимизацию. Моя оптимизация всё равно быстрее 9 минут вместо 11 с половиной вашей, на моём компьютере. Veshurik, запустите через командную строку и напишите текст с ошибкой. -------- Zetper, на счёт скорости. Можно распараллелить. Попробовал тупо разделить файлы на 2 папки и запустить 2 скрипта, оба закончили примерно за 4:30. На счёт версий Python. Недавно узнал про pipenv, который умеет создавать виртуальные среды любых версий и пакетов и работать с ними отдельно, не засоряя основную установку. https://docs.python-guide.org/dev/virtualenvs/ |
| Zetper:
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:
--- Цитата: Zetper от 04 Ноябрь 2019, 22:44:09 ---HEX = unclear.hex(' ').upper() на python-3.4.3 она выдаст ошибку. --- Конец цитаты --- Ох, и правда "New in version 3.5.". --- Цитата: Zetper от 04 Ноябрь 2019, 22:44:09 ---Я не заметил обновления твоего комментария, сможешь увеличить скорость распаковки сжатия ? --- Конец цитаты --- Так и подумал, нужно было отдельно добавлять, я по привычке обновляю последний. Не смогу. По-хорошему нужно профилировать тот код, может он не медленный. Проще распараллелить. Собрал скрипт в 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) делать. |
| Zetper:
--- Цитата: Sharpnull от 04 Ноябрь 2019, 23:57:04 ----------- Использовал 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:
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:
Sharpnull Спасибо за ускорение, строчка hexlify(unclear, ' ').upper().decode() снова вызывает ошибку пишет что второй аргумент лишний TypeError: hexlify() takes exactly 1 argument (2 given) без , ' ' работает но слитно получается строчка. В принципе эти байты можно пропустить и не отображать они всё ровно не несут полезной информации. |
| Sharpnull:
--- Цитата: Zetper от 05 Ноябрь 2019, 11:03:55 ---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' --- Конец кода --- |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |