排错
有次小白骂骂咧咧的带着笔记本来了我家,说我给下载的广场舞有问题,放到广场舞音箱上播放不出来,说是我下载歌曲的问题。
来到我这里,先复现问题,她拿出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...
- 安装pip3
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
需要功能
- 多线程处理
threading
- shell脚本多线程支持
subprocess
(os.system不支持多线程处理) ffmpeg 对多种格式进行统一处理成mp3~~~~
- 格式为:
ffmpeg -i 输入文件 -codec:a libmp3lame -qscale:a 2 输出文件~~~~
- -c:a libmp3lame 只处理音频,使用mp3lame库
- qscale:a 2 输出音频,动态编码,质量等级2(数值越小质量越好
- 格式为:
代码
import os,re
import threading
import subprocess~~~~~~~~
output_path = f'{os.path.expanduser("~")}/Desktop/mp3recode/'
if not os.path.exists(output_path):
os.mkdir(output_path)
lock = threading.Lock()
def loop(pool):
while True:
try:
with lock:
fp = next(pool)
except StopIteration:
break
filename = os.path.basename(fp).split('.')[0]
cmd = f'ffmpeg -i \"{fp}\" -codec:a libmp3lame -qscale:a 2 \"{output_path}{filename}.mp3\"'
p = subprocess.Popen(args=cmd , shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
for line in iter(p.stdout.readline, b''):
print(f'{line}')
p.stdout.close()
p.wait()
def getlist(folder):
for p,fd,fl in os.walk(folder):
for fp in fl:
if fp.startswith('.') or not re.search(r'\.(mp3|mp4|mkv|m4a|m4v|avi|mpeg|wma|wmv|wav)', fp.lower()):
continue
yield p+'/'+fp
if __name__ == "__main__":
folder = input('folder to convert:')
if os.path.isdir(folder):
pool = getlist(folder)
ths = []
for k in range(20):
t = threading.Thread(target=loop, name=f'thread k', args=(pool,))
t.start()
ths.append(t)
for k in ths:
k.join()
else:
folder = folder.rstrip()
folder = folder.replace('\ ',' ')
os.system(f'ffmpeg -i \"{folder}\" -codec:a libmp3lame -qscale:a 2 \"{output_path}{os.path.basename(folder)}\"')
print('==end==')
总结
方便好用
辅助
ffmpeg参数解释 https://blog.csdn.net/a251628...