音频ncm格式转mp3格式

2023-12-16 12:36
文章标签 音频 格式 mp3 ncm

本文主要是介绍音频ncm格式转mp3格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做个笔记,ncm格式转mp3格式
参考:传送门

import os
import json
import base64
import struct
import logging
import binascii
from glob import glob
from tqdm.auto import tqdm
from textwrap import dedent
from Crypto.Cipher import AES
from multiprocessing import Poolclass TqdmLoggingHandler(logging.StreamHandler):"""Avoid tqdm progress bar interruption by logger's output to console"""# see logging.StreamHandler.eval method:# https://github.com/python/cpython/blob/d2e2534751fd675c4d5d3adc208bf4fc984da7bf/Lib/logging/__init__.py#L1082-L1091# and tqdm.write method:# https://github.com/tqdm/tqdm/blob/f86104a1f30c38e6f80bfd8fb16d5fcde1e7749f/tqdm/std.py#L614-L620def emit(self, record):try:msg = self.format(record)tqdm.write(msg, end=self.terminator)except RecursionError:raiseexcept Exception:self.handleError(record)log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
handler = TqdmLoggingHandler()
fmt = '%(levelname)7s [%(asctime)s] %(message)s'
datefmt = '%Y-%m-%d %H:%M:%S'
handler.setFormatter(logging.Formatter(fmt, datefmt))
log.addHandler(handler)def dump_single_file(filepath):try:filename = filepath.split('/')[-1]if not filename.endswith('.ncm'): returnfilename = filename[:-4]for ftype in ['mp3', 'flac']:fname = f'{filename}.{ftype}'if os.path.isfile(fname):log.warning(f'Skipping "{filepath}" due to existing file "{fname}"')returnlog.info(f'Converting "{filepath}"')# hex to strcore_key = binascii.a2b_hex('687A4852416D736F356B496E62617857')meta_key = binascii.a2b_hex('2331346C6A6B5F215C5D2630553C2728')unpad = lambda s: s[0:-(s[-1] if isinstance(s[-1], int) else ord(s[-1]))]with open(filepath, 'rb') as f:header = f.read(8)# str to hexassert binascii.b2a_hex(header) == b'4354454e4644414d'f.seek(2, 1)key_length = f.read(4)key_length = struct.unpack('<I', bytes(key_length))[0]key_data = f.read(key_length)key_data_array = bytearray(key_data)for i in range(0, len(key_data_array)):key_data_array[i] ^= 0x64key_data = bytes(key_data_array)cryptor = AES.new(core_key, AES.MODE_ECB)key_data = unpad(cryptor.decrypt(key_data))[17:]key_length = len(key_data)key_data = bytearray(key_data)key_box = bytearray(range(256))c = 0last_byte = 0key_offset = 0for i in range(256):swap = key_box[i]c = (swap + last_byte + key_data[key_offset]) & 0xffkey_offset += 1if key_offset >= key_length:key_offset = 0key_box[i] = key_box[c]key_box[c] = swaplast_byte = cmeta_length = f.read(4)meta_length = struct.unpack('<I', bytes(meta_length))[0]meta_data = f.read(meta_length)meta_data_array = bytearray(meta_data)for i in range(0, len(meta_data_array)):meta_data_array[i] ^= 0x63meta_data = bytes(meta_data_array)meta_data = base64.b64decode(meta_data[22:])cryptor = AES.new(meta_key, AES.MODE_ECB)meta_data = unpad(cryptor.decrypt(meta_data)).decode('utf-8')[6:]meta_data = json.loads(meta_data)crc32 = f.read(4)crc32 = struct.unpack('<I', bytes(crc32))[0]f.seek(5, 1)image_size = f.read(4)image_size = struct.unpack('<I', bytes(image_size))[0]image_data = f.read(image_size)target_filename = filename + '.' + meta_data['format']with open(target_filename, 'wb') as m:chunk = bytearray()while True:chunk = bytearray(f.read(0x8000))chunk_length = len(chunk)if not chunk:breakfor i in range(1, chunk_length + 1):j = i & 0xffchunk[i - 1] ^= key_box[(key_box[j] + key_box[(key_box[j] + j) & 0xff]) & 0xff]m.write(chunk)log.info(f'Converted file saved at "{target_filename}"')return target_filenameexcept KeyboardInterrupt:log.warning('Aborted')quit()def list_filepaths(path):if os.path.isfile(path):return [path]elif os.path.isdir(path):return [fp for p in glob(f'{path}/*') for fp in list_filepaths(p)]else:raise ValueError(f'path not recognized: {path}')def dump(*paths, n_workers=None):header = dedent(r'''_  _  ___ __  __ ___  _   _ __  __ ____ __ _  _| \| |/ __|  \/  |   \| | | |  \/  | _ \| '_ \ || | .` | (__| |\/| | |) | |_| | |\/| |  _/| .__/\_, |_|\_|\___|_|  |_|___/ \___/|_|  |_|_|  |_|   |__/                                        pyNCMDUMP                     https://github.com/allenfrostline/pyNCMDUMP  ''')for line in header.split('\n'):log.info(line)all_filepaths = [fp for p in paths for fp in list_filepaths(p)]if n_workers > 1:log.info(f'Running pyNCMDUMP with up to {n_workers} parallel workers')with Pool(processes=n_workers) as p:list(p.map(dump_single_file, all_filepaths))else:log.info('Running pyNCMDUMP on single-worker mode')for fp in tqdm(all_filepaths, leave=False): dump_single_file(fp)log.info('All finished')if __name__ == '__main__':from argparse import ArgumentParserparser = ArgumentParser(description='pyNCMDUMP command-line interface')parser.add_argument('paths',metavar='paths',type=str,nargs='+',help='one or more paths to source files')parser.add_argument('-w', '--workers',metavar='',type=int,help=f'parallel convertion when set to more than 1 workers (default: 1)',default=1)args = parser.parse_args()dump(*args.paths, n_workers=args.workers)

在这里插入图片描述

这篇关于音频ncm格式转mp3格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/500498

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使