Modifying MP3 Bitrate in Bulk

Challenge:

Be able to convert the bitrate and other audio modifications in bulk and be able

Solution:

Param various filters and mods like trimming silence etc. using a python script

import os
import glob
import argparse
import subprocess
from mutagen import File
from pydub.utils import mediainfo


def process_file(input_file, output_folder_path, bitrate_in_kbps,
                 sample_rate, silence):
    main_meta = File(input_file)
    output_file = os.path.join(
        output_folder_path, os.path.basename(input_file)
    )
    output_folder = os.path.dirname(output_file)
    if not os.path.isdir(output_folder):
        os.makedirs(output_folder)

    original_bit_rate = int(mediainfo(input_file)['bit_rate'])

    if sample_rate:
        if silence:
            subprocess.call(
                ['ffmpeg', '-loglevel', 'panic', '-y', '-i',
                 input_file, '-ac', '1', '-ab',
                 str(bitrate_in_kbps * 1000), '-ar', str(sample_rate),
                 '-af', 'silenceremove={}'.format(silence), output_file]
            )
        else:
            subprocess.call(
                ['ffmpeg', '-loglevel', 'panic', '-y', '-i',
                 input_file, '-ac', '1', '-ab',
                 str(bitrate_in_kbps * 1000), '-ar', str(sample_rate),
                 output_file]
            )
    else:
        if silence:
            subprocess.call(
                ['ffmpeg', '-loglevel', 'panic', '-y', '-i',
                 input_file, '-ac', '1', '-ab',
                 str(bitrate_in_kbps * 1000),
                 '-af', 'silenceremove={}'.format(silence), output_file]
            )
        else:
            subprocess.call(
                ['ffmpeg', '-loglevel', 'panic', '-y', '-i',
                 input_file, '-ac', '1', '-ab',
                 str(bitrate_in_kbps * 1000), output_file]
            )

    out_meta = File(output_file)
    out_meta.clear()
    for key, value in main_meta.items():
        out_meta[key] = value
    out_meta.tags.save(v2_version=3, filename=output_file)

    print(
        "File `{}` [bitrate {}kbps] was converted to "
        "`{}` [bitrate {}kbps]".format(
            input_file, original_bit_rate // 1000, output_file, bitrate_in_kbps
        )
    )
    return output_file


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='MP3 channel to mono and given bitrate changer.'
    )
    parser.add_argument(
        '-i', '--input', help='Parent directory with the MP3 files.',
        required=True
    )
    parser.add_argument(
        '-o', '--output',
        help='Directory where the converted files will be saved.',
        required=True
    )
    parser.add_argument(
        '-br', '--bitrate',
        help='Bitrate in kbps to use for conversion.', type=int,
        required=True
    )
    parser.add_argument(
        '-sr', '--sample-rate',
        help='Sample rate to use for conversion.', type=int,
        required=False,
        default=None,
        dest='sample_rate'
    )
    parser.add_argument(
        '-s', '--silence',
        help='Silence parameter value to use for conversion.',
        default=None
    )
    args = parser.parse_args()

    source = args.input
    output = args.output
    bitrate = args.bitrate
    sample_rate = args.sample_rate
    silence = args.silence

    mp3_files = list()

    for file in glob.glob(
            os.path.join(source, '**/*.mp3'), recursive=True
    ) + glob.glob(
        os.path.join(source, '**/*.MP3'), recursive=True
    ):
        if os.path.isfile(file):
            if file not in mp3_files:
                mp3_files.append(file)

    if not mp3_files:
        raise RuntimeError("source does not contains any mp3 files")

    if not os.path.isdir(output):
        os.makedirs(output)

    for file in sorted(mp3_files):
        process_file(
            input_file=file,
            output_folder_path=os.path.join(output,
                                            os.path.relpath(
                                                os.path.dirname(file),
                                                source)),
            bitrate_in_kbps=bitrate,
            sample_rate=sample_rate,
            silence=silence,
        )

    print("Process completed, converted {} files.".format(len(mp3_files)))

1. http://blog.gregzaal.com/how-to-install-ffmpeg-on-windows/

Ready to simplify your digital operations?