처음의 기획의도를 벗어나 무인코딩 재생을 지원한 후부터 계속 구현하고 싶었지만 구현하지 못한 기능 - H.264 하드웨어 가속 기능이 이제야 구현되었다. 꽤 오랫동안 이런 저런 자료를 찾아봤으나 마땅한 답을 얻기 힘들었던터라 오기가 생겼고, 오기가 생기던 말던 구현이 되지 않아 항상 마음에 걸리고 툭하면 짜증도 나고 그랬는데... 아아- 속이 다 시원하다.






H.264 가속?


아이폰/아이패드 등의 iOS 기기는 MP4, M4V, MOV 파일을 재생할 때 하드웨어를 이용해서 CPU 점유를 거의 하지 않고 베터리 소모도 최소화된다. 좀 더 정확히 말하자면 모든 MP4 파일이 그런게 아니라 영상은 H.264 코덱, 음성은 AAC 코덱으로 인코딩해서 MP4 컨테이너로 감싼 동영상에 한해 그렇다.


포장하는 방법만 다를 뿐 AVI나 MKV 파일 역시 H.264+AAC 코덱으로 인코딩 될 수 있다. 하지만 iOS는 MP4 컨테이너 이외의 포장지를 뜯는 방법을 모른다. 그래서 직접 프로그래밍해서 포장지를 벗겨내야 한다. 문제는 포장지를 벗겨낸 후, 추출된 영상과 음성에 대해 하드웨어 지원을 전혀 받을 수 없다는 것. 해당 영상과 음성을 디코딩하는 API가 공개되어 있지 않아서 포장지를 뜯었다해도 하드웨어의 지원을 받는건 불가능하다.


결국 압축된 스트림을 해석하는 과정 또한 코드로 작성해야 하고, 그래서 CPU에 큰 부담을 넘겨야 한다. 무인코딩 동영상 재생 앱으로 비디오를 재생하면 기기가 금새 따뜻해지고 배터리가 빨리 닳는 이유가 그 때문이다.


특히 영상을 해석하는 과정에서 심각한 부하가 걸린다. 사실 음성을 소프트웨어로 해석하는 과정은 CPU 부담이 그리 큰 편이 아니다. 하지만 영상은 차원이 다른, 엄청난 작업량을 자랑한다. 그러므로 어떻게든 영상의 해석에 대해서만이라도 하드웨어의 지원을 받을 수만 있다면 굉장한 퍼포먼스 향상을 꾀할 수 있다.


디코딩 관련 API가 막혀 있다고 해서 방법이 전혀 없는 것은 아니다. 잘 알려진 동영상 플레이어 앱인 AVPlayer가 하이브리드 디코딩이라는 이름으로 결과를 보여줬다. 그런고로... 방법은 있다. 다만 내가 알지 못할 뿐!




전문가의 도움을 받다.


작년 한 해 내내 이런 저런 방법을 시도했지만 번번히 실패했다. '누군가 이미 구현했다면 나라고 못할 것 없다-' 는 생각을 갖고 있기 때문에 오기와 짜증이 솟구쳤다. 한 해가 그렇게 지나가고 올해 초 뜻밖의 기회로 AVPlayer 개발자님을 만났다. (이 블로그가 나를 소개하는데 큰 도움이 됐다)


같은 동영상 플레이어 앱을 개발하고, AVPlayer의 강점 중 하나인 하이브리드 디코딩 기능을 구현하려는 내가 그 분께는 무척 불편할 수 있었을텐데도 불구하고 너무나 잘 대해 주셨다. 여러가지 조언을 아끼지 않으셨고, 덕분에 길이 열렸다. 


그 길은 그동안 생각했던 여러가지 가능성 중에서 가장 성가신 길이었다. 구현이 어려워서가 아니라 (그렇다고 쉬운 일은 아니다; ) 관련 지식이 너무 없었기 때문이다. 그래서 조언을 받았음에도 바로 구현할 수 없었다. 일단 공부가 좀 필요했고, 여러가지 실험을 해야 했다. 어쨌든, 이제부터는 엄한 곳을 파지 않아도 되니 어렵더라도 진득하게 파면 뭐라도 되리라!


그리고 마침내, 몇 개월의 실패와 삽질 끝에 드디어 기술이 구현되었다.


이 기술은 온전히 내 힘으로 구현한 것이 아니다. AVPlayer 개발자님의 조언이 아니었더라면 분명 한두번 실패를 경험하고는 '이 방법이 아닌가보다-' 하고 그만두었을 것이다. 그렇게 기술은 끝내 구현되지 않았을 것이다. 이 자리를 빌어 다시 한 번 감사의 마음을 전한다. 고맙습니다!




완벽하진 않다.


포장지를 뜯어보니 H.264 코덱으로 압축된 영상이 있고, 그래서 H.264 가속 기능을 이용해 재생하면 대부분은 하드웨어의 지원을 받아 끊김없이 재생된다. 기기가 따듯해지지도 않고! (yaPlayer를 개발하는 동안 테스트 영상으로 아이돌 그룹 걸스데이의 행사 직캠 영상을 틀었는데 매번 뚝뚝 끊기던 것이 매끄럽게 재생되니 너무 좋더라. 걸스데이, 사... 좋아합니다)


하지만 일부 영상은 프레임이 정신없이 튀는 문제가 있다. 안타깝게도 아직 정확한 원인을 파악하지 못했다. 잘 되는 영상과 잘 안되는 영상을 구분하는 판별식을 모르겠다; 다른 몇몇 동영상 플레이어 앱에서도 같은 문제가 발생하는걸 확인하고 일단 이 상태에서 새 버전을 마무리 하기로 결정했다. 다른 앱에서도 처리하지 못했다는 것은 그것을 구분할 방법이 없거나, 아직 그런 현상을 겪지 않았을 것- 이렇게 두 가지로 생각해볼 수 있는데 아무리봐도 후자는 아닌 것 같았기 때문이다. 


H.264 가속이 잘 안되는 동영상을 판별하는 방법이 있을지도 모른다. 하지만 이 방법을 찾으려면 또 얼마나 많은 시간을 들여야 할지 가늠할 수 없었다. 업데이트 일정이 계속해서 지연되는건 결코 좋은 현상이 아니다. 적당히 선을 긋는 깡이 필요하다. 그게 지금이라고 생각한다.


만약 H.264 가속 기능을 이용해 동영상을 재생할 때 프레임이 심하게 튀는 현상이 나타난다면 재생을 중지하고 [Player Settings > H.264 가속] 옵션을 끈 후 다시 시도하면 된다. 이렇게 하면 영상과 음성의 해석을 이전의 방법, 즉 모두 소프트웨어적으로 처리한다. 


이번 업데이트에서 한 가지 아쉬운 점 하나, H.264 가속 재생에 문제가 생겼을 때의 대처 방법을 앱 내에서 설명했더라면 더 좋았을 것 같다. 소프트웨어 재생과 구분하기 위해 H.264 가속 기능으로 재생할 때 처음 1.5초간 안내 문구가 나타나게 했는데 이 문구에 '만약 재생에 문제가 있으면 가속 설정을 끄고 다시 시도하세요' 라는 문장을 추가하자니 너무 길었다. 안내 문구가 화면 절반 이상을 덮어버리게 되거든;


아직 적절한 안내 방법을 찾지 못했다. 너무 어렵게 생각하고 있는지도 모르겠다. 다음 업데이트 때는 여러가지 시도를 해보고 동영상 시청을 최대한 방해하지 않는 범위 내에서 안내 문구를 추가할 계획이다. 그 전에 H.264 가속 기능이 잘 동작하지 않는 영상을 판별하는 조건식을 찾아내는게 먼저! 판별식만 찾으면 안내 문구는 필요 없을테니까.




그 밖에...


MP4 파일의 내장 자막이 표시되지 않는 문제를 해결했다. 동영상 재생을 준비하는 과정에서 처리 순서가 어긋나 발생하는 문제였다. 내장 자막을 읽기 전에 외부/내부 자막이 없으면 자막 설정 버튼을 비활성화 시키고, 그 다음 내장 자막을 읽고 있었다. 충분히 테스트했다고 생각했는데 아니었다. 내 잘못이다. 문제가 비교적 간단했기 때문에 고치는건 매우 쉬웠다.


WebDAV 연결 시 https 프로토콜을 지원하지 못하는 문제가 있었다. 웹 연결을 위해 iOS 개발킷에 포함된 기본 클래스를 이용했는데 너무나 기본적인 처리만 하고 그 외 처리를 하지 않기 때문에 생긴 문제였다. 그래서 이번엔 웹 연결을 위해 기본 클래스를 이용하는 대신 AFNetworking 라이브러리를 이용하도록 수정했다. 하지만 갖고 있는 장비가 https 프로토콜을 지원하지 않아서 테스트를 하지 못했다. 아아... 정말 어처구니 없긴 한데; 아마 잘 될거야... 라이브러리를 믿어야지.


자막의 가독성을 높였다. 이전 버전에서는 흰색 자막 주변에 2 포인트 두께로 검정 테두리를 입혔는데 테두리가 너무 딱딱해보이는게 많이 거슬렸다. 그래서 이번엔 테두리를 부드럽게 바꿨다. 방법은 간단하다. 1) 그림자 효과를 주고 테두리 색상을 검정으로 해서 텍스트를 한 번 그린다. 2) 그리고나서 그림자 효과를 끄고 채움 색상으로 흰색을 설정해서 같은 자리에 텍스트를 다시 한 번 그린다. 끝- 나름 좋아보여서 TEDiSUB에도 바로 적용했다.


그리고 터치휠에서 재생 시간을 표시할 때 0초, 그리고 가장 마지막 시간이 제대로 표시되지 않는 문제를 해결했고, 상단 정렬이었던 자막을 하단 정렬로 수정하는 등 자잘한 부분이 개선되었다. 


아참, 그리고 드디어 한글화했다. MatrixCAM 때의 경험이 큰 도움이 되었다. 




여담


속이 다 시원하다! 정말 1년 넘게 구현하고 싶지만 구현하지 못했던, 속 끓는 시간의 연속이었는데 드디어 구현에 성공했다. 해냈다는 만족감과 새로운 기술을 갖게 되었다는 기쁨으로 충만하다. 정말... 전문가의 조언이란 참으로 대단하다는걸 느꼈다. 단순히 방법을 제시해주었기 때문만이 아니라 그보다 더 큰, 음- 용기를 불어넣어줬달까? 말로 표현하기가 어려운데, 아무튼 정말 큰 힘이 되었다.


아직 yaPlayer는 계획하고 있는 기능이 많다. 컬러풀한 자막을 지원한다던가, 비밀번호로 동영상 그룹을 잠근다던가, 동영상의 활용 측면을 강화한다던가... 마일스톤에는 아직 많은 티켓들이 [수락됨]을 기다리고 있다. 머릿속에 정리되지 않은 아이디어들도 뒹굴거린다. 늘 그래왔듯이 하나씩 야금야금 구현해 나가면서 꾸준히 업데이트할 계획이다. 3년 뒤 지금의 yaPlayer를 보면 놀라겠지; 최근 ProMan을 업데이트 했을 때처럼...


역시... 재밌다. 




신고

CATEGORIES

티스토리 툴바