잡담

오디오 프로그래밍에 대해서 – 2

libFLAC, libvorbis, opus, mp3lime 등을 이용한 디코더도 만들긴 했는데 C++ DLL을 C#에서 쓸 수 있는 브릿지 라이브러리를 만드는 과정에서 디버깅이 너무 힘들어서 일단 중지. 마샬링 과정에서 자꾸 뭐가 잘 안 돼서 삽질도 좀 했고 다행히 미디어 파운데이션 디코더와 WASAPI 오디오 플레이어 브릿지까지는 됐는데 지금은 XAudio 2 오디오 플레이어를 비롯해서 브릿지 이곳저곳에서 오류가 발생하는데 이걸 잡을 방법을 모르겠어서.

그래서 한번 C#만 가지고 프로그램을 만드는걸 도전해보기로 했다. 이미 NAudio나 CSCore같은 라이브러리가 이미 있지만 좀 더 사용법이 쉽고 간단하고 가벼운걸 만들고 싶었다.

일단 미디어 파운데이션 COM 임포트 구문을 추가해보고 있고 테스트 결과 잘 된다 싶으면 WASAPI의 COM 임포트도 추가할 예정. XAudio 2는 C#에서 COM 임포트를 하려면 가상함수 테이블을 만져야 하기 때문에 좀 귀찮아서 구현 예정은 없고 아마 OpenAL을 구현할 수는 있지 않을까 싶다.

뭐 그건 그렇고 mp3lime으로 MP3 파일 디코더 만드는 데는 삽질을 좀 했다. mp3lime으로 디코딩할 때는 ID3 태그를 제외해줘야 되는데다 프레임 크기를 잘못 잡아 읽어 전달하면 샘플이 몇몇 군데 빠져버려서 아예 그냥 직접 MP3 프레임 정보를 읽어들어서 프레임 크기 알아온 다음 프레임 크기만큼 읽어서 mp3lime에 넘겨주는 방식으로 구현해버렸다. ID3 태그 나오면 스킵해버리고.

MP3 전체 길이를 구해야 해서 프레임 당 크기를 검색해봤더니 2.6ms라고 그래서 그거만 가지고 총 프레임 갯수 * 26ms 했더니 실제 길이가 안 나오길래 그것도 좀 삽질했더니 대략 26.125ms 정도였다.

암튼 MP3 디코더 구현이 제일 지옥같았음. 이제 MP4 컨테이너에 AAC 디코더 구현할 차례였는데 얘가 더 지옥같을거 같아서 C++쪽은 일단 놔두고 C# 브릿지 만들기로 했음. 그것마저 지금 터져있는 상태지만.

광고

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.