Какой формат h.264 загружается на Android И IOS?

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

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


person JKirchartz    schedule 15.06.2011    source источник


Ответы (3)


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

person mportuesisf    schedule 15.06.2011
comment
Это превосходный пост Спасибо! - person Sedate Alien; 16.06.2011
comment
Просто хотел добавить, что, хотя он отлично работает на iPhone на большинстве Android, на которых я это тестировал (lg ally, Droid X, HTC evo, nexus s), видео отображало сообщение с просьбой запустить Steam или загрузить, и если вы выберете потоковую передачу терпит неудачу. Возможно, вам просто понадобятся некоторые настройки, я не знаю, почему он, по крайней мере, не выполнял прогрессивную загрузку, может быть просто браузер Android. - person JKirchartz; 30.06.2011
comment
Я добавил предыдущий комментарий о потоковой совместимости к исходному ответу, чтобы сделать его более полным. - person mportuesisf; 30.06.2011
comment
+1 Для командной строки ffmpeg, althgouth, все эти настройки действительно необходимы? - person Lennart Rolland; 01.03.2013
comment
Я хотел предоставить полный набор параметров командной строки. Иногда вы действительно хотите откровенно рассказать о вещах, вместо того, чтобы (возможное) изменение значений по умолчанию ffmpeg дало вам результат, отличный от того, что вы планировали. - person mportuesisf; 17.06.2013
comment
Что ж, я использовал эту гораздо более простую командную строку, и она работает для устройств iOS: ffmpeg -y -i $ INPUT -c: v libx264 -pix_fmt yuv420p -preset: v slow -profile: v baseline -crf 20 $ OUTPUT - person MoDJ; 20.06.2013
comment
Вместо использования qt-faststart вы также можете просто передать -movflags faststart в ffmpeg - person Mic92; 17.11.2014
comment
Я не понял вашего комментария о флаге командной строки -profile для кодировки H.264. Вы имеете в виду, что я должен добавить этот флаг, если я хочу получить кодировку H.264? Я создаю несколько небольших видеоклипов для включения в приложение. - person Suragch; 09.12.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

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

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

Смотрите также

person Suragch    schedule 10.12.2016

См. Поддерживаемые форматы мультимедиа Android, , в котором говорится, что h.264 поддерживается только в Android 3.0+. Более ранние версии Android поддерживают h.263. РЕДАКТИРОВАТЬ: как mportuesisf упоминает ниже, я неверно истолковал связанную таблицу. Игнорируйте этот ответ.

person Joe    schedule 15.06.2011
comment
Это неверно. В Android 3.0+ добавлена ​​поддержка h.264 для кодирования. Более ранние версии Android могут нормально воспроизводить h.264. Вам нужно тщательно выбирать параметры кодирования при кодировании контента для воспроизведения на Android, о чем и просил OP. Как правило, вы хотите кодировать с использованием «базового профиля» для совместимости с устройствами Android. - person mportuesisf; 16.06.2011
comment
Android 2.1+ поддерживает декодирование h.264. - person kinakuta; 16.06.2011
comment
@mportuesisf: вы правы, моя ошибка ... Я пропустил столбец Encoder и предположил, что комментарий Android 3.0+ применим как к кодированию, так и к декодированию. - person Joe; 19.06.2011