Вот командная строка ffmpeg, которую мы используем для перекодирования в MPEG-4 h.264 в нашей производственной среде. Мы протестировали вывод на нескольких устройствах Android, а также iOS. Вы можете использовать это в качестве отправной точки, просто настраивая такие параметры, как размер кадра / частота кадров и коэффициент qfactor.
ffmpeg -y
-i #{input_file}
-s 432x320
-b 384k
-vcodec libx264
-flags +loop+mv4
-cmp 256
-partitions +parti4x4+parti8x8+partp4x4+partp8x8
-subq 6
-trellis 0
-refs 5
-bf 0
-flags2 +mixed_refs
-coder 0
-me_range 16
-g 250
-keyint_min 25
-sc_threshold 40
-i_qfactor 0.71
-qmin 10 -qmax 51
-qdiff 4
-acodec libfaac
-ac 1
-ar 16000
-r 13
-ab 32000
-aspect 3:2
#{output_file}
Вот некоторые важные параметры, влияющие на совместимость с Android:
-coder 0 Uses CAVLAC rather than CABAC entropy encoding (CABAC not supported on Android)
-trellis 0 Should be shut off, requires CABAC
-bf 0 Turns off B-frames, not supported on Android or other h.264 Baseline Profile devices
-subq 6 Determines what algorithms are used for subpixel motion searching. 7 applies to B-frames, not supported on Android.
-refs 5 Determines how many frames are referenced prior to the current frame. Increasing this number could affect compatibility
После того, как мы закодируем наше видео с помощью этого рецепта ffmpeg, мы также пропустим видео через qt-faststart . Этот шаг повторно пересматривает видео для потоковой передачи. Мы транслируем его по HTTP на встроенный VideoView в нашем приложении для Android. Нет проблем с потоковой передачей на любое Android-устройство, о котором мы знаем.
Обновление 2013-06-17: Я просто хотел добавить примечание, что лучше придерживаться «базового» профиля для кодирования H.264 для максимальной совместимости на всех устройствах Android. Приведенная выше командная строка явно не указывает профиль H.264, но ffmpeg имеет флаг командной строки -profile
, который полезен, если вы используете его предустановки . Вы, вероятно, не должны связываться с -profile
. Я закодировал видео для своего планшета ASUS Transformer 300 (Android 4.2), используя профиль "main", а не "baseline" (через Handbrake). В «основном» профиле возникли проблемы с синхронизацией звука с воспроизведением видео.