운영 중인 4대의 오디오 트랜스코더 중 1대에 재생시간 추출하는 로직이 누락되어 있어 형상을 맞춰주고
재생시간이 누락된 데이터를 재수집을 해야 하는 상황이 발생하였다.
일단 서비스는 현재로부터 3달치만 유통되고 있기 때문에 급한 대로 최근 일부터 하나씩 수동 처리하였다.
방식은 하나하나 서비스에 들어가서 player를 통해서 노출되는 재생시간 정보를 가지고 업데이트...
하루에 60건 정도 발생하여 최근 데이터만 처리하는데도 엄청난 일이다.
인력으로는 할 수 없는 일이다.
배치 프로그램으로 처리하자!! 나는 간단하게 개발할 수 있는 php를 사용하였다.
현재 오디오 비디오 파일은 cdn에 올라가 있고 mp3파일과 mp4은 다른 팜이다.
mp3 재생시간 추출
php에서는 ftp에 올라가 있는 파일 사이즈를 가져올 수 있는 함수를 제공한다.
ftp_size ( resource $ftp_stream , string $remote_file ) : int ftp_stream :The link identifier of the FTP connection. remote_file :The remote file. Return Value : Returns the file size on success, or -1 on error. |
재생시간 구하는 계산법
재생시간 = 파일의크기(byte) * 8 / 비트레이트(bit rate) Playing time = file size (byte size) * 8 / bit rate 8을 곱해주는 이유는 바이트를 비트로 변경해주기 위함 |
서비스하는 mp3는 128 kbps 비트레이트를 갖는다.
그래서 만약 ftp_size함수를 통해 나온 값이 1000이라면
1000*8/128000로 계산하면 재생시간을 구할 수 있다.
mp4 재생시간 추출
mp4도 mp3와 동일하게 추출하려고 하였더니 차이가 발생한다....
mp4에는 이미지나 헤더 정보 등 오버헤드가 발생한다는 걸
음 그럼 어떻게 구하지....??
그러다가 php 오픈소스를 발견했다.
http://getid3.sourceforge.net/
include "./getID3/getid3/getid3.php";
$pathName = "aa.wav";
$getID3 = new getID3;
$ThisFileInfo = $getID3->analyze($pathName);
echo $ThisFileInfo['playtime_string'];
이 라이브러리를 통해서 영상의 재생시간을 구할 수 있다.
그런데!!! 안타깝게도 local 파일만 처리할 수 있다. 내가 원하는 ftp remote파일은 안된다...
그렇다고 ftp프로토콜로 모든 파일을 다운로드해 사용할 수도 없는 노릇... 음성은 50mb... 영상은 1Gb가 없는 게 3백만 개... 도저히 감당할 수 없다.
그래서 다시 머리를 굴린다..
미디어 파일을 재생하면 player에서 재생시간 정보가 보인다는 것을 착안하여
팝업창을 만들어 미디어를 player 띄워서 재생시간이 출력되면 이를 추출하기로!!
팝업창을 사용한 이유는 curl이나 file_content_gets 함수를 사용하여 플레이어 창을 실행하면 player 실 재생이 안돼서 추출할 수 없다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Index</title>
<link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet">
</head>
<script src="https://unpkg.com/video.js/dist/video.js"></script>
<script type="text/javascript" src="./jPlayer/lib/jquery.min.js"></script>
<script src="https://unpkg.com/videojs-flash/dist/videojs-flash.js"></script>
<script src="https://unpkg.com/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script>
<body>
<video id=example-video width=960 height=540 class="video-js vjs-default-skin" controls>
<source
src="미디어url"
type="application/x-mpegURL">
</video>
<script>
var player = videojs('example-video');
$("button" ).trigger( "click" );
player.one('loadedmetadata', function() {
player.duration(); //재생시간
});
</script>
</body>
</html>
재생시간이 추출되면 재생시간 update api를 호출하여 갱신하였다.
다만 아쉬운 게 이렇게 재생시간을 추출하려면 결국 브라우저에서 플레이어를 재생(백그라운드 실행 불가 실제 브라우저에서 재생이 되어야 한다.)시켜야 해서 대량을 데이터를 일괄 처리하기 어려웠고 수행 시간도 오래 걸렸다.
나는 50건씩 5분 주기로 처리하였다.
팝업으로 하다 보니 재생이 다 완료된 후에 창을 닫아줘야 했는데 이 문제는 팝업명을 1~50으로 이름을 생성하여
다음 주기일 때 이미 열린 창을 재활용하기 때문에 마지막 주기에서만 창을 닫아주면 되었다.
'Program > Php' 카테고리의 다른 글
php email 보내기 (0) | 2020.06.05 |
---|---|
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 46137376 bytes) in C:\Apache24\htdocs\test\api\test.php on line 19 해결 방법 (0) | 2020.05.27 |
입력 받은 날짜에 대한 남은 날짜 시 분 출력하기 php (0) | 2018.04.07 |
curl ssl 오류 (0) | 2018.03.12 |
PHP timezone 설정하기 오류시 (0) | 2017.11.30 |