Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用PHP对互联网广播进行重新格式化?(需要PHP专家)_Php_Apache_Stream_Mp3_Radio - Fatal编程技术网

是否可以使用PHP对互联网广播进行重新格式化?(需要PHP专家)

是否可以使用PHP对互联网广播进行重新格式化?(需要PHP专家),php,apache,stream,mp3,radio,Php,Apache,Stream,Mp3,Radio,是否可以使用PHP重新播放互联网广播? 无线电在8000端口可用。我想使用我的Web服务器并将无线电流“传输”到端口80 可能吗 我已经在谷歌上搜索过了,我发现了,但它对我不起作用。它确实有效。在我忘记更改流的MIME类型之前 我从前面提到的URL定制了解决方案(http://support.spacialnet.com/forums/viewtopic.php?f=13&t=16858&start=15). 它现在确实可以工作了,但在听了大约8分钟后,流总是会中断。有什么线索吗? (服务器最大

是否可以使用PHP重新播放互联网广播?

无线电在8000端口可用。我想使用我的Web服务器并将无线电流“传输”到端口80

可能吗

我已经在谷歌上搜索过了,我发现了,但它对我不起作用。它确实有效。在我忘记更改流的MIME类型之前


我从前面提到的URL定制了解决方案(http://support.spacialnet.com/forums/viewtopic.php?f=13&t=16858&start=15). 它现在确实可以工作了,但在听了大约8分钟后,流总是会中断。有什么线索吗?
(服务器最大执行时间设置为30秒)。我用不同的比特率测试了不同的流,但每次的行为都完全相同。有什么帮助吗

我不该告诉你这些。但从纯学术的角度来看,你可能想要使用。这将允许您加载一个文件(在本例中是一个流)并立即将其转储出去,只要它需要多长时间。(对于一条小溪来说,那是永远的。)

至于具体的细节,这可能看起来很像你提供的链接

可能的问题:脚本的最大运行时间可能会成为一个问题。我不确定。如果是这样的话,你总是可以把它增加到你在给定的听力中不可能达到的程度


最后。不要这样做…

我可能不应该回答这个问题,但我有一些空闲时间在工作,想玩一下插座

这是我的课程,它没有经过很好的测试(好吧,它在第一次运行时工作,这是可疑的),可能有问题,但它可能会给你一些有用的想法。它会像您发布的示例那样剥离冰冷的*标题,但这很容易更改

我在UbuntuTotemPlayer上测试了它,在我停止之前,它玩了10分钟,但也许我只是运气好(至少8分钟似乎不是什么神奇的数字)

<?php

ob_start();

class RadioProxy {
    CONST STREAM_content_type='audio/aac';
    CONST STREAM_timeout=1.5;

    CONST HTTP_response_header_first='/\s200\s/';
    CONST HTTP_response_header_pattern='/^[a-z\-]+:/i';
    CONST HTTP_max_line_length=1024;

    CONST HTTP_delim="\r\n";
    CONST HTTP_max_response_headers=40;
    CONST ERROR_max=5;
    CONST ERROR_interval=120;
    CONST ERROR_usleep=300000;


    private $server_name, $server_port;
    private $HTTP_headers;
    private $STREAM = NULL;
    private $STREAM_errors = array();
    private $TIMEOUT_seconds, $TIMEOUT_microseconds;

    public function __construct($server_name, $server_port, $filename='') {
        self::STREAM_set_headers();
        $this->server_name = $server_name;
        $this->server_port = $server_port;
        $this->HTTP_headers = $this->HTTP_generate_headers($filename);
        $this->connect();
    }

    private function connect() {
        $HTTP_headers_length = strlen($this->HTTP_headers);
        do {

            if (!$this->STREAM_connect()) {
                continue;
            }

            if (!$this->STREAM_send_headers()) {
                continue;
            }

            if (!$this->STREAM_skip_headers()) {
                continue;
            }

            if (!$this->STREAM_proxy()) {
                continue;
            }
        } while ($this->ERROR_is_accepteble());
    }

    private function HTTP_generate_headers($filename) {
        $header = '';
        self::HTTP_add_header($header, 'GET /' . rawurlencode($filename) . ' HTTP/1.0');
        self::HTTP_add_header($header, 'Host: ' . $this->server_name);
        self::HTTP_add_header($header, 'User-Agent: WinampMPEG/5.11');
        self::HTTP_add_header($header, 'Accept: */*');
        self::HTTP_add_header($header, 'Connection: close');
        //End of headers
        self::HTTP_add_header($header);
        return $header;
    }

    private static function HTTP_add_header(&$header, $new_header_line='') {
        $header.=$new_header_line . self::HTTP_delim;
    }

    private function ERROR_is_accepteble() {
        //Delete old errors
        array_filter($this->STREAM_errors, 'self::ERROR_remove_old');
        $this->STREAM_errors[] = time();
        usleep(self::ERROR_usleep);
        return count($this->STREAM_errors) <= self::ERROR_max;
    }

    private static function ERROR_remove_old($error_time) {
        return ($error_time - time()) <= self::ERROR_interval;
    }

    private function STREAM_connect() {
        if (!ob_get_level()) {
            ob_start();
        }
        ob_clean();
        if ($this->STREAM !== NULL) {
            fclose($this->STREAM);
        }
        $this->STREAM = fsockopen($this->server_name, $this->server_port);

        if ($this->STREAM === FALSE) {
            return FALSE;
        }

        $this->TIMEOUT_seconds = floor(self::STREAM_timeout);
        $this->TIMEOUT_microseconds = ceil((self::STREAM_timeout - $this->TIMEOUT_seconds) * 1000);
        return stream_set_timeout($this->STREAM, $this->TIMEOUT_seconds, $this->TIMEOUT_microseconds);
    }

    private function STREAM_send_headers() {
        return fwrite($this->STREAM, $this->HTTP_headers) === strlen($this->HTTP_headers);
    }

    private function STREAM_skip_headers() {
        $read_expect = array($this->STREAM);

        $if_first_header = true;
        $header_lines_count = 0;

        do {
            stream_select($read_expect, $NULL, $NULL, $this->TIMEOUT_seconds, $this->TIMEOUT_microseconds);

            $header_line = stream_get_line($this->STREAM, self::HTTP_max_line_length, self::HTTP_delim);

            if ($header_line === FALSE) {
                return FALSE;
            }
            if ($if_first_header) {
                $if_first_header = false;

                if (!preg_match(self::HTTP_response_header_first, $header_line)) {
                    return FALSE;
                }
                continue;
            }

            if (empty($header_line)) {
                return TRUE;
            }

            if (!preg_match(self::HTTP_response_header_pattern, $header_line)) {
                return FALSE;
            }

            $header_lines_count++;
        } while ($header_lines_count < self::HTTP_max_response_headers);

        return FALSE;
    }

    private function STREAM_proxy() {
        $read_expect = array($this->STREAM);

        //No output buffering should be here!
        while (@ob_end_clean ());

        do {
            stream_select($read_expect, $NULL, $NULL, $this->TIMEOUT_seconds, $this->TIMEOUT_microseconds);
        } while (fpassthru($this->STREAM));
    }

    private static function STREAM_set_headers() {
        //Clean all output
        ob_clean();
        header("Content-type: " . self::STREAM_content_type);
        ob_flush();
    }

}

$TestRadio = new RadioProxy('XXX.XXX.XXX.XXX', XXXX,'XXXX.mp3');

这在技术上是绝对可能的。我会尝试使用wireshark查看数据包。SHOUTcast专有的8分钟标记可能缺少某些内容


您也可以尝试缓冲一下。可能流会暂停?

您是否获得原始流的许可?如果他们播放文案音乐或任何需要支付版税的材料,您这样做实际上可能是违法的。即使他们有权播放(例如,由于支付版税),你可能不需要。我肯定会找到我是否需要许可。但无论如何,这将是第二步。第一步是找出技术上是否可行。事实上,我认为许可不会是问题,因为我不想重新播放任何商业电台,这将是一个法定/公共电台。但谢谢你的评论。这是真实的这是一个网络问题而不是编程问题。你应该看看像netcat这样简单的东西。这怎么不是编程问题呢?他在问源代码!为什么这是一个问题?无论如何,我绝对不想增加最大运行时间。我不想破坏一些东西。我只是在试验,所以不要恨我:)在不增加最大运行时间的情况下进行尝试。我相当肯定它不需要它,因为我们在CMS中使用它来制作大型视频,并且有很短的时间限制。它现在正在工作,但在听了大约8分钟后,流总是会中断。有什么线索吗?(最大执行时间设置为30秒)不确定。可能是两端的某个东西中断了连接。我在不同的机器和不同的internet连接上测试了它,我甚至测试了不同的无线流比特率(128kb/s和32kb/s),但问题仍然是一样的…感谢您的努力,我稍后会检查它。你们为什么一直说我不应该这么做?这是一种不好的做法,是危险的,是法律问题还是真正的问题??这似乎是个愚蠢的问题,但我真的不明白。ThanksWell,除了法律问题之外,你的问题似乎是一个非常简单的网络问题()或/和url重写问题,用PHP解决它是一个非常糟糕的做法。@tomexx到底什么不起作用?它根本不起作用,或者你还有8分钟的限制吗?您是否将流的MIME类型更改为适合您的类型?我需要更多的信息来帮助你更好地:你的操作系统类型/版本,你用来测试这个流的程序,你的PHP/Web服务器版本,你试图重新传输的流,等等。我用119.59.98.4端口8050流/Ubuntu11.04/PHP5.3.3-1ubuntu9.6和Suhosin补丁/Apache2.2.16(Ubuntu)/Totem播放器进行了测试。@tomexx,如果您现在可以测试,我认为在聊天室(内置聊天室/gmail/ICQ/Skype/?)中继续讨论会更有成效。@tomexx,很抱歉。正如我所说,这只是应用程序的一般方向,而不是防弹解决方案。您发布的解决方案确实让我认为,流式音乐的HTTP服务器只能使用此处描述的标题(icy*和content type*)进行应答,但实际上它似乎可以发回任何HTTP标题(服务器、缓存控制等)。我通过创建更软的regexp检查解决了这个问题,但是如果您有任何问题,您可以禁用对接收到的头的检查(“preg_match(self::HTTP_response_header_*,$header_line)”)或读取关于无线流的RFC。