rtckit / sdp
PHP的会话描述协议(SDP)库
0.1.1
2024-01-05 22:52 UTC
Requires
- php: >=8.1.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5
- vimeo/psalm: ^5.18
README
符合RFC 2327、RFC 4566和RFC 8866的SDP解析/序列化库,用于PHP。
快速入门
会话描述解析
安装后,您可以直接解析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使用了PHPStan和Psalm
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)
贡献
可以通过问题跟踪器提交错误报告(和小的补丁)。对于重大补丁,更喜欢通过分支存储库并提交拉取请求。