2012-05-26 2 views
0

필자는 순수 자바 오디오 믹싱 라이브러리를 만들려고합니다. 안드로이드와 함께 사용할 수있는 라이브러리가 좋지만, 실제로는 실용적이지는 않지만 확실히 흥미로운 것입니다. 나는 그것이 이미 끝났다고 확신하지만, 단지 내 자신의 학습 경험을 위해 나는 주변에서 일할 압축 모델이 없기 때문에 wav 파일로 이것을하려고 노력하고있다.모바일 오디오 믹싱 소프트웨어에서 메모리를 어떻게 관리해야합니까?

java.io의 특성을 감안할 때 많은 InputStream 유형의 클래스를 정의합니다. 각각은 기본적으로 일부 기본 리소스에서 데이터를 읽는 작업을 구현합니다. 나중에 데이터로 수행하거나, 자신의 주소 공간에 집계하거나 집계하는 것은 사용자의 책임입니다. 내가 순수하게 자바가되기를 바란다. 모든 것 (JNI는 필요 없음)에서 작동하고, 낮은 메모리 구성에 최적화되며, 확장이 간단합니다.

RIFF 형식의 특성과 PCM 샘플 데이터를 어셈블하는 방법을 알고 있지만 파일을 메모리로 확장하는 데 필요한 메모리를 관리하는 가장 좋은 방법은 없습니다. FileInputStream을 사용하면 기본 파일 시스템과 읽기 작업이 호출되는 방식에 따라 한 번에 많은 양의 데이터 만 읽을 수 있습니다. FileInputStream은 파일에서 사용자가 색인을 생성하는 방법을 제공하지 않으므로 나중에 혼합하기 위해 스트림을 검색 할 수 없습니다. 내 목표는 기본 청크의 적절한 영역을 읽고 쓸 수있는 Java 객체로 RIFF 문서를 확장하는 것입니다.

전체에 공간을 할당하면 (예 : 모든 PCM 샘플 데이터는 평균 노래 당 50MB와 같습니다. 일반적인 스마트 폰이나 태블릿에서 전체 성능에 영향을 미칠 가능성은 얼마나됩니까? 아마 청크가 InputStream에있는 곳을 추적 할 수있는 내 자신의 InputStream 유형을 제안하는 것이 나을 것입니까? 파일의 경우 PCM 샘플을 가져올 때 많은 블로킹이 발생하지만 시스템의 전체 메모리 사용량은 줄입니다.

답변

1

귀하의 모든 질문을 이해할 수 있는지 확실하지 않지만 가능한 답변을 드리겠습니다. 의견에 분명히 설명해 주시면 수정하겠습니다.

대용량 파일을 재생하려고하는 DAW 유형 앱이나 파일/동영상 플레이어의 경우 모든 파일 데이터를 메모리에 보관하지 마십시오. 이것은 메모리 모델에 따라 일부 장치에서 작동하지만 문제가 있는지 묻습니다.

대신 필요한 경우 (즉, 필요시) 파일의 필수 섹션을 읽으십시오. 실제로는 오디오 재생 스레드에서 파일을 읽지 않으려 고하기 때문에 이보다 약간 더 복잡합니다 (대기 시간이 짧고 오디오 재생을 원하지 않아 파일 대기 시간이 길어지며 대기 시간이 길어집니다.). 이 문제를 해결하려면 미리 파일의 일부를 버퍼링해야 할 수 있습니다. (콜백 또는 블로킹 모델을 사용하는지 여부에 따라 다름)

FileInputStream을 사용하면 파일에있는 모든 위치를 추적해야합니다 (밀리 초 또는 샘플을 바이트로 변환하는 작업이 필요함). 헤더 [1]의 크기를 고려). RandomAccessFile은 arround를 뛰어 넘을 수 있기 때문에 약간 더 나은 옵션입니다. 프로그래밍 오디오 소프트웨어에 대한 이야기에서

내 슬라이드는 콜백 V 차단 혼동하는 경우 특히 도움이 될 수 있습니다 : http://blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html

[1] 또는, 더 정확하게는 파일의 오디오 데이터의 오프셋을 알고.

+0

감사합니다. Bjorn, RandomAccessFile은 내가 찾고있는 데이터 구조입니다. 또한, 확실히 그것을 차단하기 때문에 재생 스레드에서 파일을 읽지 않을 것입니다. 오히려 청크 영역에 액세스하여 샘플을 혼합하거나 필터링 한 다음 새 wav 파일을 쓰는 데이터 구조를 만들고 싶습니다. 모든 것을 메모리로 읽어 들이지 않고 기존의 입력 스트림과 바이트 버퍼를 사용하여이를 수행하는 방법을 보지 못했습니다.나는 확실히 당신의 슬라이드를 체크 아웃 할 것입니다. 무리 감사. –

+0

FileInputStream을 사용할 수 있습니다. 파일의 이전 지점으로 돌아가려면 다시 열어야합니다. 내 경험상,이 성능에 치명적인 타격은 살인자가 아니지만 YMMV와 YMMV를 테스트 한 적이 없습니다. 분명히 RandomAccessFile은보다 자연스러운 작업 방법입니다. –