#android #h.264 #rtp #sdp
#Android #h.264 #rtp #sdp
Вопрос:
Android будет воспроизводить как аудио, так и видео (AAC, h263), которые я передаю на сервер со своего rtp-сервера, но когда я обслуживаю поток AAC / H264, я получаю только аудио, а не видео.
В рабочем сценарии Android выдает команду НАСТРОЙКИ для обоих идентификаторов дорожек, но H264, android никогда не выдает команду настройки для второй видеодорожки.
Правильный ли мой SDP-файл? Идентификатор профиля и запросы, которые, я считаю, верны, поскольку скопированы непосредственно из sps и pps NALS из кодировщика H264. Видео является baseline@2.1
Android не может повторно воспроизвести или распознать вторую дорожку?
Если я передаю видеофайл сам по себе с помощью live555, он работает нормально, и я сравнил SDP-файл, который он создает, с моим собственным.
Есть идеи? Спасибо
Файл H264 / AAC SDP:
v=0
o=xxx IN IP4 192.168.13.43
s=live.3gp
u=http:///
e=admin@
c=IN IP4 0.0.0.0
b=AS:187
t=0 0
a=control:rtsp://192.168.13.43:555/live.3gp
a=isma-compliance:1,1.0,1
a=range:npt=0- 2630.336000
m=audio 0 RTP/AVP 97
a=rtpmap:97 MP4A-LATM/44100/2
a=control:rtsp://192.168.13.43:555/live.3gp/trackID=1
a=fmtp:97 profile-level-id=41; cpresent=0; config=400024203fc0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:rtsp://192.168.13.43:555/live.3gp/trackID=2
a=cliprect:0,0,256,432
a=framesize:96 432-256
a=fmtp:96 packetization-mode=1; profile-level-id=42C015;sprop-parameter- sets=Njc0MkMwMTVGNDBEODQzNjAyMjAwMDAwMDMwMDIwMDAwMDAzMDNDMUUzMDY1NA==,NjhDRTA0NzI=
SDP-файл, созданный live555 для того же видеофайла, который отображается на Android:
v=0
o=- 1303401850159891 1 IN IP4 192.168.13.58
s=H.264 Video, streamed by the LIVE555 Media Server
i=live.3g
t=0 0
a=tool:LIVE555 Streaming Media v2011.01.19
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:H.264 Video, streamed by the LIVE555 Media Server
a=x-qt-text-inf:baseCasterCap.264
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42C015;sprop-parameter-sets=Z0LAFfQNhDYCIAAAAwAgAAADA8HjBlQ=,aM4Ecg==
a=control:track1
Ответ №1:
в sprop-parameter-sets не должно быть табуляции или пробела (может быть ошибка копирования / вставки).
Android (или используемый там проигрыватель) может не поддерживать пакетирование — требуется режим 1. 0; 1 необязателен.
a = framesize и a = cliprect — они не являются стандартными H.264, но могут и не быть проблемой.
Я предполагаю, что порт 0 является нормальным для вашего использования (поскольку звук работает)? В предложении-ответе порт 0 будет отклоненным потоком (в ответе; в предложении это означает отключенный поток).
Я видел реализации (я смотрю на ТЕБЯ, Grandstream!), которые настаивают на пробелах после точки с запятой для H264 fmtp (они неправильные) — у вас есть смесь.
Правильно ли указано «C0» в идентификаторе уровня профиля? это добавляет ограничений; попробуйте без ограничений и посмотрите, каков будет ответ. (Вы все еще можете отправлять поток с более ограниченными возможностями, чем указано в SDP.)
Комментарии:
1. Привет, Джесуп, спасибо за твой ответ! Пространство sprop действительно было ошибкой копирования и вставки. Я удалил «a = framesize и a = cliprect» и попробовал разные режимы пакетирования, но безуспешно. Я также скорректировал пробелы в строке h264 fmt, как вы предложили, но опять без какой-либо удачи. А также, как вы сказали, я изменил C0 для profile-iop на 80 (что в соответствии со спецификацией указывает на базовые ограничения), но у меня все еще нет видео. Тот же файл будет правильно транслироваться с live555, и я попытался скопировать этот sdp-файл как можно больше. Как вы думаете, это может быть не связано с файлом sdp?
2. Единственное, что заставляет меня думать, что это связано, это то, что файл будет правильно транслироваться с live555. Спасибо
3. Ничто не гарантирует, что live555 соответствует спецификации (или что Android Player соответствует спецификации). Как упоминалось ранее, порт 0 кажется мне очень подозрительным, но может быть в порядке, поскольку звук работает. У вас есть пример, который действительно работает с этим проигрывателем для сравнения? Также — сократите его до минимума. Кроме того, проверьте разрешение и другие значения PPS / SPS и убедитесь, что проигрыватель будет отображать видео с этими значениями. Возможно, что-то в потоке «не нравится». (Это было бы несовместимо, но никто не применяет это, и разрешение, в частности, является сложной проблемой.) И поддерживает ли проигрыватель уровень 2.1?
4. Тот же видеофайл h264 (только необработанное видео, без звука) с live555 создает следующий SDP-файл (обратите внимание на тот же порт: 0, на моем сервере порты создаются при обновлении НАСТРОЕК для дорожки). Он корректно отображается на телефоне Android. Android поддерживает базовый уровень 3 (я полагаю, это означает «до»), но видео отлично декодируется с помощью live555. Я попытаюсь сократить его до минимума и посмотреть, что произойдет. Я дважды проверю SPS / PPS, но я уверен, что они соответствуют — Android поддерживает 30 кадров в секунду и 480 x 360 пикселей — но опять же, мои параметры такие же, как у live555, который действительно работает. Это странно!
5. Я добавил рабочий SDP-файл из live555 к исходному вопросу, он не очень хорошо отображается здесь, в комментариях! 🙂 Спасибо
Ответ №2:
Спасибо за вашу помощь, Jesup, это было очень ценно.
Проблема заключалась в параметрах sprop, которые я заметил, когда копировал и вставлял второй SDP-файл для вас.
Кодировщик, который я использовал для вычисления base64 для моего тестирования, предназначался для символьных данных, а не для двоичных данных. Таким образом, 65 интерпретировался как символ 6 и символ 5 и кодировался, а не как единственное число (я думаю, в ascii). Имеет ли это смысл? Глупая ошибка с моей стороны. Еще раз спасибо, Ян