使用 python ffmpeg 批量检查 音频文件 是否损坏或不完整

自用工具,检查下载的音乐是否有损坏 或 下载不完整

使用方法,把 in_dir = r'D:\158首无损珍藏版' 改成你自己的音乐文件夹路径

如果发现文件有损坏,则会在命令行打印错误文件的路径

注意,要求 ffmpeg 命令可以直接在命令行调用

实现原理,使用 ffmpeg 解码时,会在 stderr 打印错误信息的特性,检测 stderr 里面是否有失败相关的关键字,从而判断媒体文件是否损坏

python 复制代码
import os
from glob import glob
import subprocess
import locale


in_dir = r'D:\158首无损珍藏版'

audio_exts = ('.wav', '.flac', '.mp3', '.wma', '.ogg', '.m4a', '.ape', '.opus', '.aac', '.mka')


def is_bad_file(file):
    p = subprocess.Popen(f'ffmpeg -i "{file}" -v error -f null -', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    err_text = p.stderr.read().decode(locale.getpreferredencoding()).lower()

    is_bad = False

    for bad_text in ['error', 'failed', 'illegal']:
        if bad_text in err_text:
            is_bad = True

    return is_bad


for file in glob(f'{in_dir}/**/*.*', recursive=True):
    ext = os.path.splitext(file)[1].lower()
    if ext not in audio_exts:
        continue

    if is_bad_file(file):
        print(f'Found bad audio. {file}')
相关推荐
likerhood几秒前
java的泛型(generics)详细讲解
java·开发语言
duke869267214几秒前
PHP怎么使用Eloquent Attribute Synthesis属性合成_Laravel多源数据融合【指南】
jvm·数据库·python
2301_812539672 分钟前
CSS如何制作下拉菜单弹性展开_利用transform-origin
jvm·数据库·python
知识分享小能手4 分钟前
R语言入门学习教程,从入门到精通,R语言流程控制语句(5)
开发语言·学习·r语言
大龄码农-涵哥5 分钟前
Java 调用 LLM 全解析:ChatGPT、Claude、通义千问一网打尽
java·开发语言·chatgpt
2401_833033626 分钟前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法
jvm·数据库·python
小新同学^O^6 分钟前
简单学习 --> JVM
java·开发语言·python
iuvtsrt7 分钟前
SQL如何优化子查询的性能_改写为JOIN关联查询与消除嵌套
jvm·数据库·python
郝学胜-神的一滴8 分钟前
二叉树与递归:解锁高级数据结构的编程内功心法
开发语言·数据结构·c++·算法·面试
2403_883261099 分钟前
C#怎么使用并发集合 C#ConcurrentDictionary和ConcurrentQueue线程安全集合怎么用【进阶】
jvm·数据库·python