VIDEOCUBE
[ Cube Project ] 개발 일지 ( 샘플링하기 ) 본문
이전 작업으로 MP4 를 이용한 분석을 통해서 샘플데이터를 추출해 볼 수 있습니다.
또한 HLS 를 이용하여 segment list 를 추출해 줄 수도 있습니다.
이제는 TS 를 만들어야 합니다.
사용자로 하여금 요구된 시간만큼 TS 로 muxing 을 해야 합니다.
다음 조건을 충족해야 합니다.
해당 조건은 요구된 시간입니다.
ㄴ 시간 정보를 통해서 샘플의 데이터를 가져와야 합니다.
ㄴ 사용자가 요구하는 시간의 시작지점과 요구되는 duration 값을 받습니다.
예를 0초 부터 10초 10초 부터 20 초간격의 데이터를 요구하는 경우 다음과 같이 받도록 합니다.
0초 부터 10초 ( 0, 10 )
10초 부터 20 초 ( 1, 10 )
첫번째는 sequence, 두번째는 duration 으로 칭합니다.
저에게는 MP4 의 총 duration 정보를 알수 있습니다.
ㄴ moov > mvhd > duration | moov > mvhd > timescale
ㄴ timescale : 1000
ㄴ duration : 596567
저에게는 MP4 정보 중에서 Chunk 의 Offet 정보를 알수 있습니다.
ㄴ Chunk 는 Sample 의 집합체 입니다. 즉 한개의 Chunk 에는 여러개의 Sample이 존재 할 수 있습니다.
저에게는 MP4 정보 중에서 Trak 정보를 얻을 수 있습니다.
ㄴ Trak > mdia > hdlr > handler-type : vide, soun 으로 구분으로 Sound 데이터와 video 데이터로 구분하였습니다.
시간 정보를 통해서 Chunk 의 Offet 위치를 찾아야 합니다.
ㄴ 시간 알아내기 위해서 stts 테이블을 확인해 보았습니다.
(샘플)
Video : [{'count': 14315, 'delta': 512}]
Audio : [{'count': 25687, 'delta': 1024}, {'count': 1, 'delta': 423}]
Video 는 512 duration 을 가진 샘플의 개수가 14315 개를 가지고 있습니다.
ㄴ 512 * 14315 = 7329280
Audio 는 1024 duration 을 가진 샘플의 개수가 25687 개를 가지고 있습니다.
ㄴ 1024 * 25687 = 26303488 + 423 = 26303911
입니다. 위 mvhd 기준의 timescale 기준으로는 정상적인 총 durtaion 이 아닙니다.
영상의 총 길이 timescale 1000 에서 duration 596567 ( moov > mvhd 참조 )
596567 / 1000 = 596.567
해당 timescale 과 해당 duration 정보는 각 trak 에 있는 mdia > mdhd 의 테이블을 확인해 봤습니다.
Video : {'language': '1010111000111', 'timescale': 12288, 'modification_time': '1970-01-01 00:00:00', 'flag': 0, 'version': 0, 'create_time': '1970-01-01 00:00:00', 'duration': 7329280}
video 의 샘플 timescale 은 1초에 12288 입니다.
7329280 / 12288 = 596.4583333333333
Audio : {'language': '1010111000111', 'timescale': 44100, 'modification_time': '1970-01-01 00:00:00', 'flag': 0, 'version': 0, 'create_time': '1970-01-01 00:00:00', 'duration': 26303911}
audio 의 샘플 timescale 은 1초에 44100 입니다.
26303911 / 44100 = 596.460566893424
즉 Video 의 1초를 가지려면 512를 가진 샘플을 12288 이 되도록 계산을 해야 합니다.
12288 / 512 = 24 즉 1초의 Video 샘플은 24개가 됩니다.
같은 방식으로 Audio 의 1초를 가지로면 1024를 가진 샘플을 44100이 되도록 계산을 해야 합니다.
44100 / 1024 = 43.06640625
물론 위 샘플은 동일한 duration 을 가지고 있는 샘플이 존재하기 때문에 쉽게 계산이 되지만, 도중에 duration 이 다를 수 있는 점 유의 해야 합니다.
이로써 사용자가 요구하는 시작 시점의 샘플의 위치를 stts 를 이용해 몇번째 샘플부터 몇개의 샘플을 추출해야 하는지에 대한 정보를 가져보았습니다.
'프로젝트' 카테고리의 다른 글
[ Cube Project ] 개발 일지 ( TS 분석 ) (0) | 2018.11.23 |
---|---|
[ Cube Project ] 개발 일지 ( 샘플링하기 ) (0) | 2018.11.18 |
[ Cube Project ] Python MP4 Streaming Server (0) | 2017.12.05 |
[Cube Project] Nginx + Python CGI 연동 준비 (0) | 2017.12.04 |
GitLab 활용하기 ( Git 등록 ) (0) | 2017.11.22 |