Какой формат h.264 загружается на Android и IOS?
Теоретически, как IOS, так и ANDROID будут воспроизводить файлы h.264, но я не могу понять, как их кодировать, чтобы они действительно работали на кросс-платформе. Кто-нибудь знает, как кодировать для Android и IOS, используя один файл?
p.s. Я знаю все о видео html5 и резервных источниках, я просто не хочу кодировать и размещать новое видео для каждого устройства, которое сходит с щуки.
Ответы
Ответ 1
Здесь используется командная строка 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). "Основной" профиль дал проблемы с синхронизацией звука с видео при воспроизведении.
Ответ 2
Я использовал это, чтобы сделать приложение 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 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
Дальнейшее исследование
Большая часть этой информации я нашел по следующим ссылкам:
См. также
Ответ 3
Смотрите поддерживаемые Android форматы мультимедиа, , в котором говорится, что h.264 поддерживается только в Android 3.0+. Более ранние версии поддержки Android h.263. EDIT. Как упоминает mportuesisf ниже, я неверно истолковал связанную таблицу. Игнорируйте этот ответ.