SRS 스 트림 미디어 서버 에 HLS 암호 화 기능 추가 (소스 코드 추가)

4714 단어 스 트 리밍
SRS 스 트림 미디어 서버 에 HLS 암호 화 기능 추가 (소스 코드 추가)
이전에 테스트 에서 nginx 의 HLS 암호 화 기능 을 사용 한 적 이 있 습 니 다. nginx - rtmp - module 이라는 플러그 인 을 사용 할 것 입 니 다. 그러나 이 플러그 인 은 오랫동안 업데이트 되 지 않 았 습 니 다. 인터넷 에서 중국 에서 제 작 된 SRS 라 는 스 트 리밍 서버 를 검색 하여 비교적 활발 합 니 다. 또한 이 스 트 리밍 서버 의 성능 과 기능 이 매우 강하 다 고 합 니 다. 그러나 안 타 깝 게 도 HLS 암호 화 기능 이 없습니다.원작 자 에 게 왜 이 기능 을 추가 하지 않 았 는 지 물 어보 고 답장 이 없 으 니 직접 손 을 써 서 먹고 입 는 것 이 좋 겠 다. 몇 밤 동안 nginx - rtmp 를 참고 하여 이 루어 졌 다.코드 를 github 에 올 렸 습 니 다.
기능 소개
새로 추 가 된 매개 변수 설정 항목
 hls_keys        on;
 hls_fragments_per_key 4;
 hls_key_file     [app]/[stream]-[seq].key;
 hls_key_file_path    ./objs/nginx/html;
 hls_key_url     http://localhost:8080/live/h265.m3u8;
 

각각 다음 과 같은 의 미 를 대표 한다.
  • hls_keys: hls 암호 화 를 열 지 여부 입 니 다. 기본적으로 닫 습 니 다
  • hls_fragments_per_key: 키 마다 몇 개의 ts 세 션 을 암호 화 할 수 있 습 니까? 기본 값 은 10 입 니 다
  • hls_key_file: key 파일 의 상대 경로 생 성 템 플 릿 은 [app] 폴 더 와 이름 [stream] - [seq] 를 포함 하고 접 두 사 는. key 이 며 기본 값 은 [app] / [stream] - [seq]. key 입 니 다
  • hls_key_file_path: key 파일 생 성 을 위 한 로 컬 디 렉 터 리 를 지정 할 수 있 습 니 다. 기본 값 은 hls 입 니 다.path (ts 를 저장 하 는 디 렉 터 리)..
  • hls_key_url: key 에 HTTP url 을 지정 할 수 있 습 니 다

  • 실현 과정 중의 몇 가지 관건
    실현 해 야 할 기능 점 은 몇 가지 측면 을 포함한다.
    설정 파일 에서 설정 항목 읽 기
    이것 은 srs 의 실현 에 따라 추가 하 는 것 이 비교적 간단 하 다.
    key 와 iv 의 자동 생 성 및 저장
    여기 서 hls 마다fragments_per_key 개 ts 는 무 작위 16bytes 의 key 와 iv 를 자동 으로 생 성 합 니 다.key 는 hls 에 저 장 됩 니 다.key_file_path 경로 에서 iv 는 m3u 8 파일 에 저 장 됩 니 다.
    코드 구현 중 키 와 iv 는 메모리 에 세 부 를 저장 합 니 다.SrsHlsMuxer 에 new SrsHlsSegment 를 제공 할 때마다 필요 한 key 와 iv 를 제공 하 는 데 사 용 됩 니 다.m3u 8 (refresh m3u 8) 을 새로 고 칠 때마다 m3u 8 파일 을 처음부터 다시 만들어 야 하기 때문에 SrsHlsSegment 대상 마다 iv 를 백업 해 야 합 니 다.마지막 으로 writer 에 전 달 된 key 와 iv 는 AES 128 암호 화 에 사용 된다.
    AES 128 암호 화
    재료 가 모두 준비 되 었 는데, 마지막 관건 은 암호 화 이다.여기에 OpenSsl 의 암호 화 라 이브 러 리 를 사 용 했 습 니 다. SRS 의 실현 은 매번 하나의 packet (188 bytes) 을 쓰 는 것 이 고 AES 128 의 암호 화 된 raw 데 이 터 는 16 의 배수 이기 때문에 기 존의 Srs FileWriter 실현 에 버퍼 를 추가 해 야 합 니 다.16 의 배수 로 버퍼 링 한 후 (즉 188 * 4) 데 이 터 를 암호 화하 여 파일 에 씁 니 다.구체 적 인 실현 은 다음 과 같다.
    srs_error_t SrsEncFileWriter::write(void* buf, size_t count, ssize_t* pnwrite)
    {
        
        srs_assert(count == SRS_TS_PACKET_SIZE);
        srs_error_t err = srs_success;
    
        if(buflength != HLS_AES_ENCRYPT_BLOCK_LENGTH)
        {
            memcpy(tmpbuf+buflength,(char*)buf,SRS_TS_PACKET_SIZE);
            buflength += SRS_TS_PACKET_SIZE;
        }
        if(buflength == HLS_AES_ENCRYPT_BLOCK_LENGTH)
        {
            unsigned char encryptedbuf[HLS_AES_ENCRYPT_BLOCK_LENGTH]; 
            memset(encryptedbuf,0,HLS_AES_ENCRYPT_BLOCK_LENGTH);
            AES_cbc_encrypt((unsigned char *)tmpbuf, (unsigned char *)encryptedbuf, HLS_AES_ENCRYPT_BLOCK_LENGTH, &key, iv, AES_ENCRYPT);
            buflength = 0;
            memset(tmpbuf,0,HLS_AES_ENCRYPT_BLOCK_LENGTH);
            return SrsFileWriter::write(encryptedbuf,HLS_AES_ENCRYPT_BLOCK_LENGTH,pnwrite);
        }
        else
        {
            return err;
        }
     
    };

    주의해 야 할 것 은 close TS 파일 의 FD 가 있 을 때마다 버퍼 에 데이터 가 있 는 지 판단 해 야 합 니 다. 있 으 면 채 워 진 데 이 터 를 추가 해 야 합 니 다 (16 의 배수 에 추가 하면 됩 니 다). 그리고 암호 화하 고 파일 을 쓰 고 파일 을 닫 습 니 다.
     int addBytes = 16 - buflength % 16;
     memset(tmpbuf + buflength, addBytes, addBytes);
     unsigned char encryptedbuf[buflength+addBytes];

    테스트
    HLS TS 절편 을 정상적으로 암호 화하 고 재생 할 수 있 습 니 다.충분 한 테스트 를 하지 않 아 SRS 에 대해 깊이 알 지 못 했다.이 기능 이 필요 하 시 면 사용 해 보 세 요. 문제 가 생기 면 연락 주세요.
    어떻게 사용 합 니까?
    우선 설정 파일 에 다음 설정 항목 을 추가 합 니 다.
    http_server {
        enabled         on; 
        listen          8080;
        dir             ./objs/nginx/html;
    }
     
    vhost __defaultVhost__ {
        hls {
            enabled         on; 
            hls_fragment    10; 
            hls_window      600000;
            hls_path        ./objs/nginx/html;
            hls_m3u8_file   [app]/[stream].m3u8;
            hls_ts_file     [app]/[stream]-[seq].ts;
            hls_keys        on; 
            hls_fragments_per_key 4;
            hls_key_file     [app]/[stream]-[seq].key;
            hls_key_file_path    ./objs/nginx/html;
            hls_key_url       http://localhost:8080/live;
        }   

    그리고 trunk 디 렉 터 리 에서 시작 합 니 다:
    ./objs/srs -c conf/hls.conf

    rtmp 흐름 을 푸 시 하 는 명령:
    ffmpeg -re  -i /Users/zexu/Movies/test.mp4 -c copy -f flv rtmp://localhost:1935/live/h265

    마지막 으로 재생 기 에서 URL 재생:
    http://localhost:8080/live/h265.m3u8

    설정 항목 에 대해 주의 할 점
    hls 에 대하 여key_file_path 와 hlskey_url, 설정 하지 않 거나 (주석 을 달 면 됩 니 다), 그러면 m3u 8, ts, key 파일 이 하나의 디 렉 터 리 아래 에 있 습 니 다.아니면 모두 설정 하고 두 주소 가 맞 을 수 있 도록 스스로 보증 해 야 합 니 다.그렇지 않 으 면 키 를 찾 지 못 해 재생 에 실패 하 는 문제 가 발생 할 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기