求助,使用php编写rtsp实现推流拉流服务

使用了一个插件rtsp插件,然后自己写拉流推流服务,推流没有报错,但是拉流没有数据,服务端会自动断开连接,请问有大牛知道问题在哪里吗?
首先要安装composer require phpbg/rtsp插件。
代码:

<?php
require __DIR__ . '/vendor/autoload.php';
use PhpBg\Rtsp\Session;
$loop = React\EventLoop\Factory::create();
//Normal port is 554 but we use 5540 instead to avoid root required
$socket = new \React\Socket\TcpServer('tcp://0.0.0.0:5540', $loop);
$logger=new \PhpBg\MiniHttpd\Logger\Console(\Psr\Log\LogLevel::DEBUG, 'php://stderr', new \PhpBg\MiniHttpd\Logger\ConsoleFormatter(false));
global $sessions;
$middlewares = [
    //$logger,
new \PhpBg\Rtsp\Middleware\AutoCseq(),
new \PhpBg\Rtsp\Middleware\AutoContentLength(),
function (\PhpBg\Rtsp\Message\Request $request, \React\Socket\ConnectionInterface $connection)use($loop,$logger,$sessions) {
    static $sessions;
    var_dump($request);
    $method=$request->method;
    $response = \PhpBg\Rtsp\Message\MessageFactory::response();
    $response->setHeader('cseq', $request->getHeader('cseq'));
    switch ($method){
        case "SETUP":
            $response->setHeader('transport', $request->getHeader('transport').';server_port=');
            $transport=$request->getHeader('transport');
            $first=explode(';',$transport);
            $array=[];
            $rtpPort='';
            $rtcpPort='';
            foreach ($first as $k=>$v){
                list($key,$val)=explode('=',$v);
                $array[$key]=$val;
                if ($key=='client_port'){
                    echo "获取播放器的端口\r\n";
                    var_dump($val);
                    $ports = explode('-', $val);
                    $rtpPort = $ports[0];
                    $rtcpPort = $ports[1];
                }
            }
            $sessionId = rand(10000000, 99999999);
            $session =  new Session($sessionId, $loop, $connection, $logger);
            $session->proto = 'UDP';

            $session->ports = [$rtpPort, $rtcpPort];
            $address = $connection->getRemoteAddress();
            $session->clientIp = trim(parse_url($address, PHP_URL_HOST), '[]');
            $session->isInterleaved = false;
            $session->transport = $request->getHeader('transport');

            $uri = trim($request->uri, '/');
            $resourcePath = explode('/', $uri);
            $channelServiceId = array_pop($resourcePath);
            $session->uri = $uri;
            //var_dump($session);
            $sessions[$sessionId]=$session;
            $response->setHeader('session', $sessionId);
            $response->setHeader('rtp-info', 'url=rtsp://127.0.0.1:5540/live/streamid=1;url=rtsp://127.0.0.1:5540/live/streamid=0;');
            return $response;
            break;
        case "PLAY":

            $sessionId=$request->getHeader('session');
            $response->setHeader('rtp-info', 'url=rtsp://127.0.0.1:5540/live/streamid=1;url=rtsp://127.0.0.1:5540/live/streamid=0;');
            $session = $sessions[$sessionId];
            $session->play();
            return $response;
        case "DESCRIBE":
            $startTime = time() + 2208988800;
            $response->body = "v=0\r\no=- 0 $startTime IN IP4 0.0.0.0\r\ns=bar\r\nt=$startTime 0\r\nm=video 0 udp 33\r\n";
            $response->setHeader('content-type', 'application/sdp');
            return $response;
        case "OPTIONS":
            if ($request->hasHeader('session')) {
                $sessionId = (int)$request->getHeader('session');
                if (!isset($sessions[$sessionId])) {
                    $response->statusCode = 454;
                    $response->reasonPhrase = 'Session Not Found';
                    return $response;
                }
                $session = $sessions[$sessionId];
                $session->keepAlive();
            }
            $response->setHeader('public', 'SETUP, TEARDOWN, PLAY');
            return $response;
        case "TEARDOWN":
            $sessionId = (int)$request->getHeader('session');
            var_dump("客户端要求关闭TEARDOWN");
            var_dump($sessionId);
            $session = $sessions[$sessionId];
            if ($session!=null){
                $session->teardown();
            }
            return $response;
            break;
        default:
            //todo  本项目实现了rtsp协议,但是不能正常推流和拉流,根据猜测,还应该创建一个管道,将数据放入到管道,推流就是将数据存入到管道,拉流就是将数据取出,
            //todo 难点是推流的数据在哪里接收,知道了数据的位置才知道怎么处理数据
            return $response;
    }
}
];

$server = new \PhpBg\Rtsp\Server(new \PhpBg\Rtsp\Middleware\MiddlewareStack($middlewares));

$server->on('error', function (\Exception $e) {
echo $e->getMessage() . "\r\n";
echo $e->getTraceAsString() . "\r\n";
});

$server->listen($socket);
echo "Server started\r\n";
echo "Open any decent video player (e.g. vlc, mpv) and open rtsp://localhost:5540\r\n";
$loop->run();
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 11

这种需求为啥不用go

1年前 评论
lantaigongzhu (楼主) 1年前
cevin (作者) 1年前
lantaigongzhu (楼主) 1年前
1年前 评论
lantaigongzhu (楼主) 1年前
哪吒的狗腿子 (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!