I am trying to compress videos files to a target size within python using ffmpeg-python for an A level project as part of my coursework, I keep getting this error saying it doesn't know the encoder. Not sure what I'm meant to do as this is literally an entirely new space to me. Am I meant to have installed the codec or something, or is there an alternative I can use?
import os, ffmpeg
##import section:this part is where I import all of the modules I will use
import tkinter
import shutil
from tkinter import filedialog
import os
def fileSelect(): #start of fileSelect function
global startingLocation #declares startingLocation as global variable
global originalName #declares originalName as global variable
global fileType #declares fileType as global variable
startingLocation = filedialog.askopenfilename(initialdir="/", title="Select file", #tkinter function that opens file explorer, lets user select file saves the file path as a variable
filetypes=(("video files", "*.mp4"),("images", "*.jpg*")))
originalName = os.path.basename(startingLocation) #os function that gets the actaul file name from the path string
print (originalName) #print statement to check if originalName has been found
fileType = startingLocation.split('.') #splits original name where any full stop in found and saves array as variable
fileType = fileType[-1] #changes variable to have the str value of the final item in the array; the file type
fileType = '.' + fileType #adds fullstop to the start of the file type so i dont have to repeatedly do it
print (fileType) #print statement to check file type is found correctly
def outputSelect(): #start of outputSelect function
global outputLocation #declares outputLocation as global variable
outputLocation = filedialog.askdirectory(initialdir="/", title="Select folder") #tkinter function that opens file explorer, lets the user select of folder as saves the folder path as a variable
def fileNewName(): #start of fileNewName function
global customName #declares customName as global variable
customName = input("Enter the end name of your file") #simple code assigning user input to the custom name vairable
customName = customName + fileType #add the fileType onto the end of the custom name
def compress(): #start of compress function
fileSelect() #calls the fileSelect function
outputSelect() #calls the outputSelect function
fileNewName()
global src
global dst #calls the fileNewName function
src = startingLocation #assigns startingLocation str as src, so the shutil module is able to use it in a cleaner way
dst = outputLocation #assigns outputLocation dst as src, so the shutil module is able to use it in a cleaner way
shutil.copy(src, dst) #shutil command that copies the file from src to dst
src = outputLocation + '/' + originalName #reassigns src as the location of the file copy
dst = outputLocation + '/' + customName #reassigns dst as the location of the file copy but with a new name
shutil.move(src,dst)
def compress_video(video_full_path, output_file_name, target_size):
# Reference: https://en.wikipedia.org/wiki/Bit_rate#Encoding_bit_rate
min_audio_bitrate = 32000
max_audio_bitrate = 256000
probe = ffmpeg.probe(video_full_path)
# Video duration, in s.
duration = float(probe['format']['duration'])
# Audio bitrate, in bps.
audio_bitrate = float(next((s for s in probe['streams'] if s['codec_type'] == 'audio'), None)['bit_rate'])
# Target total bitrate, in bps.
target_total_bitrate = (target_size * 1024 * 8) / (1.073741824 * duration)
# Target audio bitrate, in bps
if 10 * audio_bitrate > target_total_bitrate:
audio_bitrate = target_total_bitrate / 10
if audio_bitrate < min_audio_bitrate < target_total_bitrate:
audio_bitrate = min_audio_bitrate
elif audio_bitrate > max_audio_bitrate:
audio_bitrate = max_audio_bitrate
# Target video bitrate, in bps.
video_bitrate = target_total_bitrate - audio_bitrate
i = ffmpeg.input(video_full_path)
ffmpeg.output(i, os.devnull,
**{'c:v': 'libx264', 'b:v': video_bitrate, 'pass': 1, 'f': 'mp4'}
).overwrite_output().run()
ffmpeg.output(i, output_file_name,
**{'c:v': 'libx264', 'b:v': video_bitrate, 'pass': 2, 'c:a': 'aac', 'b:a': audio_bitrate}
).overwrite_output().run()
compress()
compress_video(dst, outputLocation, 3 * 1000)
Most probably, as per the error you are receiving, you should install the appropriate codec. Follow instructions online by searching for "install libx264". You will find specific information based the operating system you use. If you face more problems, please provide your OS version, list of softwware you have installed so far, and what you might have tried so far.