Точное количество секунд в видео
Я пытаюсь получить точный размер видео, используя следующее.
(размер в байтах *8)/(общая битовая скорость (аудио + видео битрейты) * 1024)
например:
(1,136,992 *8)/(7128 * 1024), что составляет 1,24617705 секунд
Но в прямом эфире Windows Movie Maker было сказано, что фактическая продолжительность в секундах была около 1,87 секунды. Я делаю что-то не так, или Windows Live Movie Maker отключен? Я предполагаю, что это первое.
Я использовал видео, записанное с Easycap, затем поместил его в Windows Live Movie Maker для обрезки, а затем, наконец, преобразовал в формат ogv. Так что это имеет смысл, что это будет полностью испорчено. Я не знаю, как получить доступ к заголовку метаданных видеофайла ogv, я посмотрел вокруг, но не вижу ответов.
3 ответа
Вы делите размер файла с битрейтом? Если это так, вы включаете заголовки и другие накладные расходы в свои расчеты.
Но главная причина, по которой этот расчет не работает, заключается просто в том, что битовые скорости не такие точные. Подумайте об этом: если бы скорость передачи данных была точной, каждый отдельный видеокадр (и звук, который идет с ним) должен был бы быть сжат до точно такого же количества байтов. Большинство компрессоров просто так не работают. (Единственным исключением является кодек DV. Поскольку DV является форматом ленты, он должен генерировать данные с постоянной скоростью.)
Думайте о скорости передачи данных больше как о среднем числе битов, используемых в секунду.
Чтобы узнать длину видеофайла, вам нужно прочитать метаданные файла. Как это сделать, отличается от формата к формату. Для файла ogv программа oggLength, похоже, вам нужна (включена в oggvideotools).
Видеофайлы часто имеют метаданные и заголовки, которые увеличивают общий размер файла. Чтобы получить надежные измерения, вам необходимо рассчитать размер не видео / не аудио данных и вычесть их перед выполнением расчета. Не только это, но вы также должны учитывать возможную переменную скорость передачи аудио и видео данных. Как правило, это будет нелегко, если вы не смотрите на очень простой тип файла с постоянной скоростью передачи данных, или вы уже глубоко знаете формат видео (или у вас уже есть библиотека, которая понимает и анализирует формат).
Этот конкретный расчет будет работать, только если каждый кадр имеет одинаковый размер. Единственный способ это сделать, если вы используете несжатый видео и аудио поток. Эти типы файлов становятся огромными и непрактичными очень быстро, поэтому, вероятно, вы используете сжатие. В сжатых видеофайлах битрейт НЕ является гарантией, он просто средний. Кроме того, размер каждого кадра изменяется, так как существуют разные типы кадров.
Большинство форматов контейнеров видео (avi, ogm, mkv и т. Д.) Все включают длину файла в метаданные (как часть заголовка). Было бы гораздо точнее просто прочитать это значение.