Django - Audio Streaming

DevSmiler·2020년 3월 22일
1

장고 오디오 스트리밍

이번 포스팅에서는 장고에서 제공하는 StreamingHttpResponse를 이용해서, 장고에서 스트리밍을 하는 방법에 대해서 설명하려고 합니다.
이번 스트리밍은 사운드 클라우드 홈페이지(Sound Cloud)를 클로닝 하면서 사용했던 주요 기술 중에 하나로 꼭 남기고 싶은 내용이라서 포스팅을 하게 되었습니다.

사용했던 라이브러리

Django 기본 라이브러리
StreamingHttpResponse

Streaming 이란

한번에 큰 데이터를 보내기에는 너무 속도가 느려지므로 데이터를 쪼개보내 것을 말한다. 보통 Audio, Video를 재생하거나 할때, 많이 사용하게 된다.

장고에서 StreamingHttpResponse를 이용해서 스트리밍을 했습니다.

데이터를 Chunk 512bytes 단위로 나누어서 스트리밍을 했습니다.
스트리밍 방식은 ProgressiveDownload 방식을 이용했습니다.

사용한 기술 - Progressive Download 방식

  • 장점
    구현이 쉽고 Url만 알려주면 되는 간단한 방식입니다.

  • 단점
    Traffic이 높습니다
    유료 서비스에 적합하지 않습니다(전체파일을 가지고 오는 방식)
    보안 문제가 필연적으로 있을 수 밖에 없습니다
    비디오나 오디오 경우 품질 변화를 하기가 어렵습니다

StreamingHttpResponse

본래 목적은 먼저 화면은 랜더링을 하고, 뒤늦게 로드를 해야되는 큰 데이터들을 로드를 하기 위해서 만들어진 목적의 장고의 기본 Response 입니다. 압축된 데이터를 쓰는 .mp3 같은 압축된 음원들을 쓰는데는 무리가 없을 것으로 보이지만, 원래 목적은 대량의 csv파일들을 보내는데 쓰는 목적이므로 Video(영상)에는 적합해 보이진 않습니다. 장고 공식 문서에도 퍼포먼스 하락의 문제가 있을 것이라고, 적혀 있습니다.

스트리밍 방법

  • 파일 전체 사이즈를 구해서 해당 원하는 바이트만큼 읽어서 Yield자료형으로 묶어놓고 클라이언트 응답때 까지 기다리는 방식으로 코드를 작성했습니다.

  • 중간 스트리밍을 할 때에는

    파일 전체바이트 수: 원하는 바이트수 위치 = 음원길이 전체: 원하는 음원 시간

방식으로 계산을 하면 원하는 바이트 수 위치를 정확하게 알 수 있습니다.
그런 방식으로 중간부터 스트리밍이 가능하게 했습니다(아래 코드는 이전 버전이라서 중간 스트리밍은 구현이 안되어 있습니다.)

Code

코드는 2차, 3차 수정을 거쳐서 많이 변형이 되고, 전반적인 내용들이 많이 변화가 되고 있는 중입니다. 지속적으로 Refactoring을 하고 있습니다.

class playView(View):
    def get(self,request):
        try:
            song_id='dummy'
            source = settings.MEDIA_URL+"/"+song_id
            resp = StreamingHttpResponse(self.iteration('zico.mp3',0),status=200, content_type='audio/mp3')
            resp['Cache-Control']='no-cache'
            return resp
        except Exception as identifier:
            print(identifier)
            return HttpResponse(status=400)

    def iteration(self,path,time):# 처리해주는 놈
        f = open(path,'rb+')
        while True:
            c = f.read(512)
            if c:
                yield c
            else:
                break
  • Reference - Django Official Documentation
profile
A ship is always safe at the shore, but that is not what it is built for - Albert Einstein

1개의 댓글

comment-user-thumbnail
2022년 8월 29일

혹시 이러한 방법으로 구현하였을때 여러명의 사용자가 동시에 스트리밍이 가능한가요?

답글 달기