Какой формат h.264 загружается на Android и IOS? - PullRequest
29 голосов
/ 16 июня 2011

Теоретически и IOS, и ANDROID будут воспроизводить файлы h.264, но я не могу определить настройку для их кодирования, чтобы они фактически работали кроссплатформенно.Кто-нибудь знает, как кодировать для Android и IOS, используя один файл?

ps Я знаю все о html5-видео и запасных источниках, я просто не хочу кодировать и размещать новое видео для каждого устройства, которое выходит из строя.

Ответы [ 3 ]

52 голосов
/ 16 июня 2011

Вот командная строка 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). В «основном» профиле возникли проблемы с синхронизацией звука с воспроизведением видео.

3 голосов
/ 10 декабря 2016

Я использовал это для создания приложений для Android и iOS со встроенными видео. Видео воспроизводится в обеих версиях. ( Пример Android ) ( Пример iOS )

Дополнительный ответ

Этот ответ является дополнением к принятому ответу, объясняющий некоторые параметры.

ffmpeg 
-y                  # Overwrite output files without asking.
-i input_filename   # input file name    
-s 432x320          # size of output file
-b:v 384k           # bitrate for video
-vcodec libx264     # use H.264 video codec
-flags +loop+mv4    # use loop filter and four motion vector by macroblock
-cmp 256            # ??? Full pel motion estimation compare function
-partitions +parti4x4+parti8x8+partp4x4+partp8x8      #???
-subq 6             # determines algorythms for subpixel motion searching and partition decision
-trellis 0          # optimal rounding choices
-refs 5             # number of frames referenced prior to current frame
-bf 0               # turn of B-frames, something to do with H.264 and Baseline Profile
-flags2 +mixed_refs # ??? gave me an error so I just deleted it
-coder 0            # turn of the CABAC entropy encoder
-me_range 16        # max range of the motion search
-g 250              # GOP length (250 is the recommended default)
-keyint_min 25      # Minimum GOP length (25 is the recommended default)
-sc_threshold 40    # adjusts sensitivity of x264's scenecut detection (default is 40) 
-i_qfactor 0.71     # Qscale difference between I-frames and P-frames (0.71 is the recommended default)
-qmin 10 -qmax 51   # min and max quantizer (10 and 51 are the recommended defaults)
-qdiff 4            # max QP step (4 is recommended default)
-c:a aac            # Set the audio codec to use AAC
-ac 1               # number of audio channels 
-ar 16000           # audio sampling frequency
-r 13               # frames per second
-ab 32000           # audio bitrate
-aspect 3:2         # sample aspect ratio
output_filename     # name of the output file

Не стесняйтесь редактировать это, если вы можете заполнить некоторые детали, в которых я не был уверен.

Здесь снова в формате вырезать и вставить. (Мне также пришлось добавить параметр -strict -2, чтобы aac работал на моем компьютере.)

ffmpeg -y -i input_file.avi -s 432x320 -b:v 384k -vcodec libx264 -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8 -subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -c:a aac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2 -strict -2 output_file.mp4

Дальнейшее обучение

Большую часть этой информации я нашел по следующим ссылкам:

Смотри также

0 голосов
/ 16 июня 2011

См. Поддерживаемые Android форматы мультимедиа , , в которых говорится, что h.264 поддерживается только в Android 3.0+. Более ранние версии Android поддерживают h.263. EDIT : Как упоминалось ниже в mportuesisf, я неверно истолковал связанную таблицу. Игнорировать этот ответ.

...