Как конвертировать трек VP8 с другим разрешением кадра в h264

У меня есть файл.webm с дорожкой VP8, записанной из потока WebRTC внешней службой (Архивация TokBox). Поток является адаптивным, поэтому каждый кадр на дорожке может иметь разное разрешение. Большинство игроков (в браузерах webkit) используют разрешение видео из описания дорожки (которое всегда составляет 640x480) и масштабируют кадры до этого разрешения. Firefox и VLC player используют реальное разрешение кадра, соответственно меняя разрешение видео.

Я хочу достичь 2 целей:

  1. воспроизведите это видео в Internet Explorer 9+ без установки дополнительных плагинов.
  2. измените разрешение кадров на одно фиксированное разрешение, чтобы видео в разных браузерах выглядело одинаково.

Итак, мой план:

  • извлекать кадры из исходного файла webm в изображения с реальным разрешением кадров (например, PNG или BMP) (как я могу это сделать?)
  • найти максимальную ширину и максимальную высоту изображений
  • добавьте черное заполнение к изображениям, чтобы меньшие кадры были в центре нового кадра (размером MAX_WIDHTxMAX_HEIGHT)
  • объединить изображения на дорожку h264 с помощью ffmpeg

Все правильно? Как мне этого добиться? Можно ли каким-то образом оптимизировать этот алгоритм?

Я попытался ffmpeg для извлечения изображений, но он не анализирует реальное разрешение кадра, используя разрешение из заголовка дорожки. Я думаю, что некоторые функции libwebm могут помочь мне (разобрать заголовки кадра и извлечь изображения). Может быть, у кого-то есть фрагменты кода для этого?

Пример.webm (загрузить исходный код, не воспроизводите версию, конвертированную в Google): https://drive.google.com/file/d/0BwFZRvYNn9CKcndhMzlVa0psX00/view?usp=sharing

Официальное описание адаптивного потока от поддержки TokBox: https://support.tokbox.com/hc/en-us/community/posts/206241666-Archived-video-resolution-is-supposed-to-be-720x1280-but-reports-as-640x480

1 ответ

Решение

Если вы бежите

ffprobe -show_entries frame=width,height -of compact=p=0:nk=1 video.webm

вы получите вывод, который выглядит следующим образом:

1254|800
1058|800
890|800
774|800
672|800

Левый столбец - это фактическая ширина каждого кадра, а правый столбец имеет высоту. Затем вы можете проверить максимальные значения в каждом столбце, чтобы использовать для размера холста.

Тогда беги

ffmpeg -i video.webm -vf pad=MAXW:MAXH:(MAXW-iw)/2:(MAXH-ih)/2 out.mp4

где MAXW и MAXH должны быть заменены значениями, которые вы обнаружили.

Другие вопросы по тегам