마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

쓰레드를 너무 많이 돌리면 파일을 생성하지 못할 수도 있나요?

0 추천

저는 지금 가수와 듀엣을 하는 앱을 만들고 있습니다. 배경음악을 출력하는 쓰레드(mAudioPlayer), 가수의 목소리를 출력하는 쓰레드(vAudioPlayer), 사용자 목소리를 녹음한느 쓰레드(mRecordThread), 각각의 파일을 짜르고 붙이는 쓰레드(mp3ConcatThread) 사용하고 있습니다.

배경음악을 돌리는 중에 가수의 목소리를 멈추고 사용자가 녹음을 하는 방식으로 작동합니다. 당연히 사용자가 녹음을 하지 않을 때는 가수의 목소리를 출력합니다. 이런 식으로 구간을 mp3 파일로 만들고 병합해 하나의 파일로 만들어야 합니다. 하지만 녹음과 병합이 제대로 되지 않는 파일이 생성되는 때가 빈번합니다

오디오 처리는 Ffmpeg 사용하여 처리하고 있습니다. 생각에는 아래와 같은 오류가 이유지 않을까 추측해 봅니다. 아래 오류 때문에 파일을 완벽히 생성하지 못하는게 아닐까요

06-26 21:37:11.084 13017-13017/com.softcode.kihnoplay I/Choreographer: Skipped 72 frames!  The application may be doing too much work on its main thread.


 

혹시 이문제의 답을 알고 있다면 답을 부탁드립니다. 감사합니다

 

준버기 (1,160 포인트) 님이 2018년 6월 26일 질문
1. thread priority 를 확인 해 보세요.
오디오 재생 Thread의 priority가 엄청 높아서, 다른 Thread에 동작할당이 늦게 될 수 있습니다.
2. " 구간을 mp3 파일로 만들고 병합해 하나의 파일" 이라는 것을 보니 File I/O가 많이 일어나 제 시간에 File I/O를 처리 못 할 가능성이 있을 듯 합니다. 중간에 파일로 만드는 과정을 생략하고, 바로 병합 해서 적도록 변경 해 보셔야 할 듯 합니다.
제가 잘 몰라서 그러는데 중간 파일 만드는 과정을 생략하고 병합이 가능한가요? 어떤 방식이 있나요. setPriority를 쓰레드마다 커스텀해서 지정해주게 되면, 지금 같은 경우 어는 한 부분에서는 run메서드의 과정을 놓치는 경우가 있을까요? 지금 현재 쓰레드가 6~7개 정도 돌아가고 있습니다. 답변 감사합니다.
* 중간 파일 만드는 과정을 생략하고 병합이 가능한가요?
ffmpeg Custom I/O 를 이용해 write callback을 등록 해주시면, write callback으로 데이터 buffer와 사이즈가 반환되니, 이걸 사용하면 됩니다.
아래 링크는 Custom I/O로 read, seek 쪽 callback을 등록해 주는 예제인데, 비슷하게 wirte callback을 넣어서 바로 사용하게 하시면 File I/O 단계를 줄이실 수 있을 겁니다.
http://imdandyu.tistory.com/13

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...