Как я могу (или можно) преобразовать профиль и уровень AV C code c в определение MIME code c? - PullRequest
1 голос
/ 24 января 2020

В моем случае я должен предоставить спецификацию кода c в типе MIME HTML5 video source. Но даже type="video/mp4; codecs=avc1" недостаточно детализирован для Firefox. Firefox требуется дополнительная детализация, например type="video/mp4; codecs=avc1.64001E". Моя проблема в том, что я не знаю, откуда взять эту 64001E деталь.

Вся идентификация происходит на стороне сервера. До сих пор я использовал ffprobe, и он отлично обеспечивает вывод в формате JSON, например:

ffprobe -select_streams v:0 -v info -of json -show_entries stream=codec_name,level,profile,width,height -i 1CE89B23-F9BD-43B9-805B-C49ACA9E5FFB_xxxxxxx.mp4 
    "streams": [
        {
            "codec_name": "h264",
            "profile": "High",
            "width": 1080,
            "height": 1920,
            "level": 50
        }
    ]
}

Я могу получить профиль и уровень, но ничего похожего на 64001E. В моем локальном окружении у меня также есть mediainfo:

mediainfo 8038B652-106B-4FBB-BAD6-AF7E32913FDE_xxxxxxx.mp4 
General
Complete name                            : 8038B652-106B-4FBB-BAD6-AF7E32913FDE_xxxxxxx.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom (isom/iso2/avc1/mp41)
File size                                : 1.18 MiB
Duration                                 : 6 s 634 ms
Overall bit rate                         : 1 496 kb/s
Writing application                      : Lavf57.83.100

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L3
Format settings                          : CABAC / 5 Ref Frames
Format settings, CABAC                   : Yes
Format settings, Reference frames        : 5 frames
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 6 s 634 ms
Bit rate                                 : 1 396 kb/s
Width                                    : 360 pixels
Height                                   : 480 pixels
Display aspect ratio                     : 0.750
Frame rate mode                          : Constant
Frame rate                               : 30.000 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.269
Stream size                              : 1.10 MiB (93%)
Writing library                          : x264 core 152 r2854 e9a5903
Encoding settings                        : cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=8 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=15 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=50 / rc=crf / mbtree=1 / crf=17.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
Codec configuration box                  : avcC

Audio
ID                                       : 2
Format                                   : AAC LC
Format/Info                              : Advanced Audio Codec Low Complexity
Codec ID                                 : mp4a-40-2
Duration                                 : 6 s 632 ms
Duration_LastFrame                       : -9 ms
Bit rate mode                            : Constant
Bit rate                                 : 90.4 kb/s
Channel(s)                               : 1 channel
Channel layout                           : C
Sampling rate                            : 44.1 kHz
Frame rate                               : 43.066 FPS (1024 SPF)
Compression mode                         : Lossy
Stream size                              : 73.2 KiB (6%)
Default                                  : Yes
Alternate group                          : 1

Здесь мы видим, что часть AA C имеет более длинный код c ID mp4a-40-2, но видеопоток по-прежнему просто avc1.

Я смотрю на списки https://tools.woolyss.com/html5-canplaytype-tester/ и https://wiki.whatwg.org/wiki/Video_type_parameters и думаю, что, возможно, есть программный c способ преобразования код c профиль + уровень к коду, который имеет спецификация кода типа MIME c.


In https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter Я вижу, что "avc1.4d002a" означает Main Profile, Level 4.2 , Глядя на список, который я связал ранее, я понял, что 6 шестнадцатеричных цифр можно разбить на группы по два. Последние два уровня. В этом последнем примере уровень равен 4.2, нам просто нужно удалить точку => она становится 42, что составляет 2a hex. Остальные 4 шестнадцатеричных числа относятся к профилю как Main, High, et c и затем Progressive, но я еще не нашел определения, и мне интересно, может ли ffprobe выводить такие вещи, как High 4:2:2 Intra Level или High Progressive Level. Посмотрим.


https://tools.ietf.org/html/rfc6381#page -12 есть несколько примеров, но я перешел по ссылкам и до сих пор не вижу какого-либо определенного списка или чего-либо еще.


В Приложении A спецификации МСЭ-T H.264 перечислены 14 профилей. В этих списках упоминается profile_idc, который, по-видимому, является десятичным для первых двух шестнадцатеричных цифр, например, High 'profile_idc - это 100 десятичных, что составляет 64 гекса. Теперь нам просто нужно выяснить две средние шестнадцатеричные цифры. Желательно, чтобы исходный файл репозитория GitHub был бы полезен, если бы эти вещи были вписаны в разумный краткий константный литеральный массив.

1 Ответ

1 голос
/ 24 января 2020

Это описано, например, в Mozilla link («PPCCLL - это шесть шестнадцатеричных цифр, указывающих номер профиля (PP), флаги набора ограничений (CC) и уровень (LL)»). Если вы не найдете инструмент, который соответствует вашим потребностям, мы могли бы расширить, например, MediaInfo для этого, , сообщите нам .
Примечание: CC, указанные в списке, являются ожидаемыми флагами, а не те, которые действительно в файле, это должно быть хорошо 99,99% времени, но вы не можете быть уверены, что это реальный контент. MediaInfo внутренне читает флаги, но пока не экспортирует их.

...