На вход могут идти видеофайлы разных форматов mp4/mov/avi.
Я использую ffprobe для того чтобы парсить метаданные, пробую из этих данных получить фактический вес файла, но получаю с погрешностью на -10% от фактического объёма, например файл 12.6MB у меня выходит в 11.9MB. Какие данные я должен ещё учитывать для того чтобы получить максимально точный объём?
import ffmpeg
def get_file_metadata(file_path):
try:
probe = ffmpeg.probe(file_path)
video_stream = next(
(stream for stream in probe["streams"] if stream["codec_type"] == "video"),
None,
)
audio_stream = next(
(stream for stream in probe["streams"] if stream["codec_type"] == "audio"),
None,
)
original_size_bytes = int(probe["format"]["size"])
original_size_mb = original_size_bytes / (1024**2)
if video_stream is not None:
video_bit_rate = int(video_stream["bit_rate"])
else:
video_bit_rate = 0
if audio_stream is not None:
audio_bit_rate = int(audio_stream["bit_rate"])
else:
audio_bit_rate = 0
duration = float(probe["format"]["duration"]) # Длительность в секундах
total_bit_rate = video_bit_rate + audio_bit_rate
output_size = (total_bit_rate / 8) * duration # Размер в байтах
return {
"video_bitrate": video_bit_rate,
"audio_bitrate": audio_bit_rate,
"duration": duration,
"input_size_bytes": original_size_bytes,
"input_size_mb": original_size_mb,
"output_size_bytes": output_size,
"output_size_mb": output_size / (1024**2),
}
except ffmpeg.Error as e:
print(f"Ошибка при обработке файла {file_path}: {e.stderr}")
return None
# Пример использования функции
if __name__ == "__main__":
file_path = "source/10.mp4"
metadata = get_file_metadata(file_path)
if metadata:
print(f'Размер входного файла: {metadata["input_size_mb"]:.2f} МБ')
print(f'Размер выходного файла: {metadata["output_size_mb"]:.2f} МБ')
Всё это я делаю, для того чтобы понять , каким образом вообще калькулировать объём видеофайлов. Так как я хочу конвертировать видеофайлы в mp4 с максимально возможным качеством при этом не выходя за рамки 12MB.