rtckit/sdp

PHP的会话描述协议(SDP)库

0.1.1 2024-01-05 22:52 UTC

This package is auto-updated.

Last update: 2024-09-06 00:15:30 UTC


README

符合RFC 2327RFC 4566RFC 8866的SDP解析/序列化库,用于PHP。

CI Status Psalm Type Coverage Latest Stable Version Installs on Packagist Test Coverage Maintainability License

快速入门

会话描述解析

安装后,您可以直接解析SDP会话描述,如下所示

<?php

use RTCKit\SDP\Parser;

require_once __DIR__ . '/vendor/autoload.php';

$parser = new Parser;
$sdp = <<<SDP
v=0
o=- 20518 0 IN IP4 192.168.0.1
s=VoIP Call
c=IN IP4 192.168.0.1
t=0 0
m=audio 5004 RTP/AVP 0 8 18
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=ptime:20
SDP;

$session = $parser->parse($sdp);
echo json_encode($session, JSON_PRETTY_PRINT);

$session变量(一个stdObject对象)将填充已解析的SDP会话描述。以下是上述示例的输出

{
    "version": 0,
    "origin": {
        "username": "-",
        "sessionId": 20518,
        "sessionVersion": 0,
        "netType": "IN",
        "ipVer": 4,
        "address": "192.168.0.1"
    },
    "name": "VoIP Call",
    "connection": {
        "version": 4,
        "ip": "192.168.0.1"
    },
    "timing": {
        "start": 0,
        "stop": 0
    },
    "media": [
        {
            "rtp": [
                {
                    "payload": 0,
                    "codec": "PCMU",
                    "rate": 8000
                },
                {
                    "payload": 8,
                    "codec": "PCMA",
                    "rate": 8000
                },
                {
                    "payload": 18,
                    "codec": "G729",
                    "rate": 8000
                }
            ],
            "fmtp": [],
            "type": "audio",
            "port": 5004,
            "protocol": "RTP\/AVP",
            "payloads": "0 8 18",
            "ptime": 20
        }
    ]
}

会话描述序列化

序列化是解析的反操作

<?php

use RTCKit\SDP\Serializer;

require_once __DIR__ . '/vendor/autoload.php';

$session = new stdClass;

$session->version = 0;
$session->origin = new stdClass;
$session->origin->username = '-';
$session->origin->sessionId = 20518;
$session->origin->sessionVersion = 0;
$session->origin->netType = 'IN';
$session->origin->ipVer = 4;
$session->origin->address = '192.168.0.1';
$session->name = 'VoIP Call';
$session->connection = new stdClass;
$session->connection->version = 4;
$session->connection->ip = '192.168.0.1';
$session->timing = new stdClass;
$session->timing->start = 0;
$session->timing->stop = 0;
$session->media = [
    new stdClass
];
$session->media[0]->rtp = [
    new stdClass,
    new stdClass,
    new stdClass
];
$session->media[0]->rtp[0]->payload = 0;
$session->media[0]->rtp[0]->codec = 'PCMU';
$session->media[0]->rtp[0]->rate = 8000;
$session->media[0]->rtp[1]->payload = 8;
$session->media[0]->rtp[1]->codec = 'PCMA';
$session->media[0]->rtp[1]->rate = 8000;
$session->media[0]->rtp[2]->payload = 18;
$session->media[0]->rtp[2]->codec = 'G729';
$session->media[0]->rtp[2]->rate = 8000;
$session->media[0]->fmtp = [];
$session->media[0]->type = 'audio';
$session->media[0]->port = 5004;
$session->media[0]->protocol = 'RTP/AVP';
$session->media[0]->payloads = '0 8 18';
$session->media[0]->ptime = 20;

$serializer = new Serializer;
$sdp = $serializer->serialize($session);
echo $sdp;

$sdp变量将包含序列化的SDP会话描述

v=0
o=- 20518 0 IN IP4 192.168.0.1
s=VoIP Call
c=IN IP4 192.168.0.1
t=0 0
m=audio 5004 RTP/AVP 0 8 18
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=ptime:20

需求

RTCKit\SDP与PHP 8.1+兼容,没有外部库和扩展依赖。

安装

您可以使用Composer将库添加为项目依赖项

composer require rtckit/sdp

如果您只需要在开发期间使用库,例如在测试套件中使用,则应将其添加为仅开发依赖项

composer require --dev rtckit/sdp

测试

要运行测试套件,请克隆此存储库,然后通过Composer安装依赖项

composer install

然后,转到项目根目录并运行

php -d memory_limit=-1 ./vendor/bin/phpunit -c ./etc/phpunit.xml.dist

静态分析

为了确保高代码质量,RTCKit\SDP使用了PHPStanPsalm

php -d memory_limit=-1 ./vendor/bin/phpstan analyse -c ./etc/phpstan.neon -n -vvv --ansi --level=max src
php -d memory_limit=-1 ./vendor/bin/psalm --config=./etc/psalm.xml

许可

MIT,请参阅LICENSE文件

致谢

  • sdp-transform - JavaScript的SDP解析器和序列化器,此库的主要灵感来源
  • RFC 2327 - SDP: Session Description Protocol (April 1998)
  • RFC 4566 - SDP: Session Description Protocol (July 2006)
  • RFC 8866 - SDP: Session Description Protocol (January 2021)

贡献

可以通过问题跟踪器提交错误报告(和小的补丁)。对于重大补丁,更喜欢通过分支存储库并提交拉取请求。