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/