If you prefer managing your music in the form of audio files on your computer, your collection has probably grown over the past few years and at the same time encoding standards have improved and expectations of sound quality have risen. In most cases, the contained audio files have different sound qualities regarding their bit rates. My motivation was to display a list of files in my music collection which have a bit rate equal to or higher than 256 kbit/s.
To achieve this, I looked for command line tools that display metadata for audio files including their bit rate. For Mac OS X I found the command afinfo
which works out of the box:
afinfo myFile.mp3 | grep "bit rate"
The output looks similar to this:
bit rate: 320000 bits per second
If you are using another operating system, you can check for the following commands and/or install them:
1 2 3 4 5 | file <fileName> (Ubuntu) mp3info -r a -p "%f %r\n" <fileName> mediainfo <fileName> | grep "Bit rate" exiftool -AudioBitrate <fileName> mpg123 -t <fileName> |
My goal was to develop a program that crawls through my whole audio collection, checks the bit rate for every file and outputs a list containing only files with high bit rate. I wrote a Python script which does exactly that:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ''' Created on 25.04.2015 @author: dave ''' import sys import os import subprocess import re # console command to display properties about your media files # afinfo works on Mac OS X, change for other operating systems infoConsoleCommand = 'afinfo' # regular expression to extract the bit rate from the output of the program pattern = re.compile('(.*)bit rate: ([0-9]+) bits per second(.*)', re.DOTALL) def filterFile(path): ''' Executes the configured info program to output properties of a media file. Grabs the output, filters the bit rate via a regular expression and displays the bit rate and the file path in case the bit rate is >= 256k Returns True in case the file has a high bit rate, False otherwise ''' process = subprocess.Popen([infoConsoleCommand, path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = process.communicate() match = pattern.match(str(out)) if match != None: bitRateString = match.group(2) bitRate = int(bitRateString) if bitRate >= 256000: print("bit rate",bitRate,":",path) return True return False def scanFolder(rootFolder): ''' Recursively crawls through the files of the given root folder ''' numFiles = 0 numFilesFiltered = 0 for root, subFolders, files in os.walk(rootFolder): for file in files: numFiles = numFiles + 1 path = os.path.join(root,file) if filterFile(path): numFilesFiltered = numFilesFiltered + 1 print("Scanned {} files from which {} were filtered.".format(numFiles, numFilesFiltered)) # main program if len(sys.argv) != 2: print("Usage: MP3ByBitrateFilter ") sys.exit(1) rootFolder = sys.argv[1] scanFolder(rootFolder) |
The root folder of your music library can be given as command line argument. The programs walks through the folder recursively and executes the command line program to display the bit rate in a separate process. It grabs the output and filters the bit rate from the output using a regular expression. The bit rate and the path of the file are displayed in case the bit rate is >= 256 kbit/s. A summary is also displayed showing the total number of files and number of filtered files.
Of course you can extend the filter criteria by adjusting the script to extract other information than the bit rate from the info command.