복붙노트

PHP를 사용하여 오디오 스트림에서 트랙 정보 가져 오기

PHP

PHP를 사용하여 오디오 스트림에서 트랙 정보 가져 오기

PHP를 사용하여 오디오 스트림에서 트랙 정보를 가져올 수 있습니까? 나는 파고를 해봤고 가장 가까운 함수는 stream_get_transports이지만 호스트는 fsockopen ()을 통한 http 전송을 지원하지 않으므로 그 함수가 반환하는 것을 더 알기 위해 좀 더 땜질해야 할 것입니다.

현재 AOL 스트림에서 아티스트를 가져오고 메타 데이터를 추적하려고합니다.

해결법

  1. ==============================

    1.이것은 SHOUTcast 스트림이며, 가능합니다. 그것은 ID3 태그와 아무런 관련이 없습니다. 나는 이것을하기 위해 잠시 전에 대본을 썼지 만 그것을 더 이상 찾을 수 없다. 바로 지난 주에 나는 똑같은 일을하기 위해 꽤 완벽한 스크립트를 가진 다른 사람을 도왔지만, 내 것이 아니기 때문에 소스를 게시 할 수는 없습니다. brad@musatcha.com으로 전자 우편을 보내면 연락을 드리겠습니다.

    이것은 SHOUTcast 스트림이며, 가능합니다. 그것은 ID3 태그와 아무런 관련이 없습니다. 나는 이것을하기 위해 잠시 전에 대본을 썼지 만 그것을 더 이상 찾을 수 없다. 바로 지난 주에 나는 똑같은 일을하기 위해 꽤 완벽한 스크립트를 가진 다른 사람을 도왔지만, 내 것이 아니기 때문에 소스를 게시 할 수는 없습니다. brad@musatcha.com으로 전자 우편을 보내면 연락을 드리겠습니다.

    어쨌든, 직접 해보는 방법은 다음과 같습니다.

    가장 먼저해야 할 일은 서버에 직접 연결하는 것입니다. HTTP를 사용하지 마십시오. 아마도 cURL을 사용할 수는 있지만 그 가치보다 훨씬 번거로울 수 있습니다. fsockopen () (doc)을 사용하여 연결합니다. 올바른 포트를 사용하십시오. 또한 많은 웹 호스트가 많은 포트를 차단하지만 일반적으로 포트 80을 사용할 수 있습니다. 다행히도 AOL에서 호스팅하는 SHOUTcast 스트림은 모두 포트 80을 사용합니다.

    이제 고객이 원하는 것처럼 요청하십시오.

    GET / 뭐든간에 HTTP / 1.0

    그러나 를 보내기 전에 다음 헤더를 포함 시키십시오!

    얼음 - 메타 데이터 : 1

    그러면 메타 데이터를 원한다는 것을 서버에 알려줍니다. 이제 쌍을 보내십시오.

    서버는 일련의 헤더로 응답 한 다음 데이터를 전송하기 시작합니다. 이 우두머리에는 얼음판 - 8192 또는 유사한 것이 있습니다. 8192는 메타 간격입니다. 이것은 중요하며 실제로 필요한 유일한 가치입니다. 일반적으로 8192이지만 항상 그런 것은 아닙니다. 따라서 실제로이 값을 읽어야합니다!

    기본적으로 8192 바이트의 MP3 데이터를 얻은 다음, 8192 바이트의 MP3 데이터가 뒤 따르고 메타 덩어리가옵니다.

    8192 바이트의 데이터를 읽은 다음 (이 수에 헤더를 포함하지 않도록하십시오), 버리고 다음 바이트를 읽으십시오. 이 바이트는 메타 데이터의 첫 번째 바이트이며 메타 데이터의 길이를 나타냅니다. 이 바이트의 값 (ord () (doc)로 실제 바이트)을 취하여 16을 곱합니다. 결과는 메타 데이터에 대해 읽을 바이트 수입니다. 바이트 수를 작업 할 문자열 변수로 읽어들입니다.

    그런 다음이 변수의 값을 잘라냅니다. 왜? 문자열은 끝에 0x0으로 채워지기 때문에 (16 바이트의 배수로 고르게 맞추기 위해) trim () (doc)이이를 처리합니다.

    너는 이런 식으로 남을거야.

    StreamTitle = '굉장한 트랜스 믹스 - DI.fm'; StreamUrl = ''

    이 구문 분석을위한 선택 방법을 선택하도록하겠습니다. 개인적으로 나는 아마 2의 한도로 쪼개지 만, 포함하는 제목은주의해야한다. 이스케이프 문자 방법이 무엇인지 잘 모르겠습니다. 약간의 실험이 도움이 될 것입니다.

    서버 사용을 마쳤 으면 서버와의 연결을 끊는 것을 잊지 마십시오!

    많은 SHOUTcast 메타 데이터 참조가 있습니다. 이것은 좋은 것입니다 : http://www.smackfu.com/stuff/programming/shoutcast.html

  2. ==============================

    2.이것 좀 봐 : https://gist.github.com/fracasula/5781710

    이것 좀 봐 : https://gist.github.com/fracasula/5781710

    스트리밍 URL에서 MP3 메타 데이터 (StreamTitle)를 추출 할 수있는 PHP 기능이 있습니다.

    보통 스트리밍 서버는 스트림에 메타 데이터가 전송되는 빈도를 알려주는 응답에 얼음 메타 인 헤더를 넣습니다. 함수는 해당 응답 헤더를 확인하고, 존재하는 경우 interval 매개 변수로 대체합니다.

    그렇지 않으면 함수는 간격을 고려한 스트리밍 URL을 호출하고 메타 데이터가 없으면 offset 매개 변수에서 재귀를 통해 다시 시도합니다.

    <?php
    
    /**
     * Please be aware. This gist requires at least PHP 5.4 to run correctly.
     * Otherwise consider downgrading the $opts array code to the classic "array" syntax.
     */
    function getMp3StreamTitle($streamingUrl, $interval, $offset = 0, $headers = true)
    {
        $needle = 'StreamTitle=';
        $ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36';
    
        $opts = [
                'http' => [
                'method' => 'GET',
                'header' => 'Icy-MetaData: 1',
                'user_agent' => $ua
            ]
        ];
    
        if (($headers = get_headers($streamingUrl))) {
            foreach ($headers as $h) {
                if (strpos(strtolower($h), 'icy-metaint') !== false && ($interval = explode(':', $h)[1])) {
                    break;
                }
            }
        }
    
        $context = stream_context_create($opts);
    
        if ($stream = fopen($streamingUrl, 'r', false, $context)) {
            $buffer = stream_get_contents($stream, $interval, $offset);
            fclose($stream);
    
            if (strpos($buffer, $needle) !== false) {
                $title = explode($needle, $buffer)[1];
                return substr($title, 1, strpos($title, ';') - 2);
            } else {
                return getMp3StreamTitle($streamingUrl, $interval, $offset + $interval, false);
            }
        } else {
            throw new Exception("Unable to open stream [{$streamingUrl}]");
        }
    }
    
    var_dump(getMp3StreamTitle('http://str30.creacast.com/r101_thema6', 19200));
    

    이게 도움이 되길 바란다!

  3. ==============================

    3.코드 fra_casula에 대해 감사드립니다. 다음은 PHP <= 5.3 (원본은 5.4를 대상으로 함)에서 실행되는 약간 단순화 된 버전입니다. 또한 동일한 연결 자원을 재사용합니다.

    코드 fra_casula에 대해 감사드립니다. 다음은 PHP <= 5.3 (원본은 5.4를 대상으로 함)에서 실행되는 약간 단순화 된 버전입니다. 또한 동일한 연결 자원을 재사용합니다.

    나는 내 자신의 필요 때문에 예외를 제거하고, 아무것도 발견되지 않으면 false를 리턴한다.

        private function getMp3StreamTitle($steam_url)
        {
            $result = false;
            $icy_metaint = -1;
            $needle = 'StreamTitle=';
            $ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36';
    
            $opts = array(
                'http' => array(
                    'method' => 'GET',
                    'header' => 'Icy-MetaData: 1',
                    'user_agent' => $ua
                )
            );
    
            $default = stream_context_set_default($opts);
    
            $stream = fopen($steam_url, 'r');
    
            if($stream && ($meta_data = stream_get_meta_data($stream)) && isset($meta_data['wrapper_data'])){
                foreach ($meta_data['wrapper_data'] as $header){
                    if (strpos(strtolower($header), 'icy-metaint') !== false){
                        $tmp = explode(":", $header);
                        $icy_metaint = trim($tmp[1]);
                        break;
                    }
                }
            }
    
            if($icy_metaint != -1)
            {
                $buffer = stream_get_contents($stream, 300, $icy_metaint);
    
                if(strpos($buffer, $needle) !== false)
                {
                    $title = explode($needle, $buffer);
                    $title = trim($title[1]);
                    $result = substr($title, 1, strpos($title, ';') - 2);
                }
            }
    
            if($stream)
                fclose($stream);                
    
            return $result;
        }
    
  4. ==============================

    4.이것은 HttpClient를 사용하여 메타 데이터를 가져 오는 C # 코드입니다.

    이것은 HttpClient를 사용하여 메타 데이터를 가져 오는 C # 코드입니다.

    public async Task<string> GetMetaDataFromIceCastStream(string url)
        {
            m_httpClient.DefaultRequestHeaders.Add("Icy-MetaData", "1");
            var response = await m_httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
            m_httpClient.DefaultRequestHeaders.Remove("Icy-MetaData");
            if (response.IsSuccessStatusCode)
            {
                IEnumerable<string> headerValues;
                if (response.Headers.TryGetValues("icy-metaint", out headerValues))
                {
                    string metaIntString = headerValues.First();
                    if (!string.IsNullOrEmpty(metaIntString))
                    {
                        int metadataInterval = int.Parse(metaIntString);
                        byte[] buffer = new byte[metadataInterval];
                        using (var stream = await response.Content.ReadAsStreamAsync())
                        {
                            int numBytesRead = 0;
                            int numBytesToRead = metadataInterval;
                            do
                            {
                                int n = stream.Read(buffer, numBytesRead, 10);
                                numBytesRead += n;
                                numBytesToRead -= n;
                            } while (numBytesToRead > 0);
    
                            int lengthOfMetaData = stream.ReadByte();
                            int metaBytesToRead = lengthOfMetaData * 16;
                            byte[] metadataBytes = new byte[metaBytesToRead];
                            var bytesRead = await stream.ReadAsync(metadataBytes, 0, metaBytesToRead);
                            var metaDataString = System.Text.Encoding.UTF8.GetString(metadataBytes);
                            return metaDataString;
                        }
                    }
                }
            }
    
            return null;
        }
    
  5. from https://stackoverflow.com/questions/4911062/pulling-track-info-from-an-audio-stream-using-php by cc-by-sa and MIT license