当前位置: 首页 > 后端技术 > Python

一步步排查小白MacOS批量mp3

时间:2023-03-26 00:47:05 Python

的问题。有一次小白拿着笔记本来我家骂骂咧咧,说我下载的广场舞有问题,广场舞音箱播放不了,说是我的。下载歌曲时出现问题。当她来找我时,她首先重现了这个问题。她拿出mp3文件复制到歌曲里,然后放到广场舞播放器里,可是歌曲就是播放不了。再次尝试通过mac直接预览mp3,发现损坏了。我得出的结论是这个播放器可能会破坏mp3文件,但是这种bug一般是极难出现的。再试卡,将卡插入电脑,将歌曲写入卡中,试听可以播放歌曲,但插上播放器无法播放,插回播放器仍然无法播放再次进入电脑。换了个mac继续这一步,还是出现问题。这时我更换了读卡器,还是出现同样的问题。很大程度上怀疑是播放器本身的问题,但对方又辩解说可以播放其他歌曲。设备很好。那么,只能拿出我的底牌,自己的广场舞播放器,把音乐拷进去,就可以正常播放了。然后把卡插到有问题的机器上就可以正常播放了。事实证明:卡坏了,重新听歌,发现不是所有的歌都能正常播放。我放了20首歌,期间跳过了7首歌。仔细查看,发现有m4a格式,但只有三首歌,说明没有。只是音频格式而已,有些mp3本身就有问题。知道了这一点,你就知道如何处理它了。python&shell使用ffmpeg做了一个简单的批处理多线程音乐转换工具,但是对方电脑是空白的,没有环境,brew无效。这时发现brew下载困难。直接去ffmpeg下载编译好的文件就可以了,毕竟你只需要这个文件。网址:https://evermeet.cx/ffmpeg/文件:https://evermeet.cx/ffmpeg/ff...直接下载,扔到~/目录下安装python3,你没看错,她没有网址:https://www.python.org/downlo...文档:https://www.python.org/ftp/py...安装pip3curlhttps://bootstrap.pypa.io/get-pip。py-oget-pip.python3get-pip.py需要多线程处理threadingshell脚本多线程支持子进程(os.system不支持多线程处理)ffmpeg统一处理多种格式成mp3~~~~格式是:ffmpeg-iInputfile-codec:alibmp3lame-qscale:a2Outputfile~~~~-c:alibmp3lame只处理音频,使用mp3lame库qscale:a2输出音频,动态编码,质量等级2(值越小,质量越好goodcodeimportos,reimportthreadingimportsubprocess~~~~~~~~output_path=f'{os.path.expanduser("~")}/Desktop/mp3recode/'ifnotos.path.exists(output_path):os.mkdir(output_path)lock=threading.Lock()defloop(pool):whileTrue:try:withlock:fp=next(pool)除了StopIteration:breakfilename=os.path.basename(fp).split('.')[0]cmd=f'ffmpeg-i\"{fp}\"-codec:alibmp3lame-qscale:a2\"{output_path}{filename}.mp3\"'p=subprocess.Popen(args=cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,close_fds=True)forlineiniter(p.stdout.readline,b''):print(f'{line}')p.stdout.close()p.wait()defgetlist(folder):forp,fd,flinos.walk(folder):forfpinfl:iffp.startswith('.')ornotre.search(r'\.(mp3|mp4|mkv|m4a|m4v|avi|mpeg|wma|wmv|wav)',fp.lower()):continueyieldp+'/'+fpif__name__=="__main__":folder=input('要转换的文件夹:')ifos.path.isdir(folder):pool=getlist(folder)ths=[]forkinrange(20):t=threading.Thread(target=loop,name=f'threadk',args=(pool,))t.start()ths.append(t)forkinths:k.join()else:folder=folder.rstrip()文件夹=folder.replace('\','')os.system(f'ffmpeg-i\"{folder}\"-codec:alibmp3lame-qscale:a2\"{output_path}{os.path.basename(folder)}\"')print('==end==')总结方便易解释辅助ffmpeg参数https://blog.csdn.net/a251628...