roomONmoon
@roomONmoon

Как рассчитать объём видеофайла с учётом аудиотрека?

На вход могут идти видеофайлы разных форматов 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.
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы