5

앱에서 생성 한 내부 사운드를 녹음 할 수 있습니까?안드로이드 앱의 내장 사운드 재생을 녹음/캡처하고 mp3를 내보낼 수 있습니까?

내 앱을 사용하면 음악 시퀀스를 만들고 재생할 수 있습니다.

soundPool.play(soundIds[i], 1f, 1f, 1, 0, Constants.TIME_RATE); 

나는 시퀀스를 녹음하고 mp3로 내보낼 수 있기를 바랍니다.

내가 Audio Capture에보고했지만 setAudioSource (INT의 audio_source 참조)은 MIC 녹음을 받아들이는 것 같다.

감사

답변

3

아니, 당신이 Visualizer API를 통해 얻을 수 있기 때문에 실제로는 전혀 사실이 아니다 (심지어 자신의 앱, 오디오 출력을 얻기위한 API가 없다,하지만 낮은 품질의 것 나는 그것이 당신을 위해 어떤 용도의 것이 될지 의심 스럽습니다.)

그런 종류의 기능을 원한다면 직접 구현해야합니다. 그건; 사운드 재생을 시작하고 믹스하고 결과를 파일에 쓸 수도 있습니다. 소리가 압축되면 직접 해독해야합니다. 당신이 당신이에 내보낼 형식이라면 어쨌든 자신의 MP3 인코더를 제공해야 할 것이다, 그래서 안드로이드에 포함 된 어떤 MP3 인코더,이 없다는 것을

주.

+0

감사합니다. 마이클 - 사운드를 어떻게 믹스하고 파일에 쓰는지 모르겠으니 어디서부터 시작해야할까요? (문서, 튜토리얼 등) – fxfuture

+0

가장 간단한 시나리오는 모든 사운드가 동일한 샘플 속도, 채널 수 등의 PCM이 아닌 경우입니다. 당신은 기본 첨가제 믹서를 사용했습니다. 믹싱은 현재 활성화 된 각 사운드의 샘플을 취하여 함께 추가 한 다음 표준 Java 파일 API를 사용하여 결과를 파일에 기록하는 것으로 구성됩니다. 추가시 오버플로가 발생하지 않도록주의해야합니다. 인코딩과 디코딩을 다루기 시작하면 더욱 복잡해집니다. 예 : Google 등 유용한 정보를 찾을 수 있습니다. "ffmpeg mp3 android"또는 "audio mixing"을 선택하십시오. – Michael

+1

감사합니다. 초보자를위한 발견 - http://mobilengineering.blogspot.it/2012/06/audio-mix-and-record-in-android.html – fxfuture

1

마이클은, u는 당신을 구현해야 말했듯 자체 엔코더와 디코더가 필요합니다. Visualizer는 사용자 정의보기 및 이퀄라이저와 동기화 된 효과를 표시하는 데 사용할 수있는 매우 낮은 품질의 데이터를 제공합니다.

이것은 link입니다. 여기서 u는 MP3 파일 용 간단한 디코더 및 인코더를 찾을 수 있습니다. 그들이 MP3 파일에서 데이터를 읽고 새로운 MP3 파일에 넣는 곳. 그들은 다른 확장 기능에 대한 지원을 만들었습니다.

http://code.google.com/p/ringdroid/source/browse/#svn%2Fbranches%2Fgingerbread%2Fsrc%2Fcom%2Fringdroid

0

http://xzpeter.org/?p=254에 따르면 그것은 당신이 안드로이드 소스를 수정하면 내부 사운드 재생을 촬영할 수 있습니다. 특히 AudioFlinger::MixerThread 클래스의 쓰기 기능. (이 기사는 조금 오래된 것입니다. 최신 안드로이드 버전에서는 AudioFlinger이 재구성되었고 쓰기 코드는 이제 threadLoop_write() 함수에서 찾을 수 있습니다).

원액 저자 인용 :

AudioFlinger은 DIR frameworks/base/services/audioflinger/하에 구현된다. 할 일은 믹서 출력을 찾는 것입니다. AudioFlinger.cpp 파일에서 은 스레드 인 AudioFlinger::MixerThread::threadLoop()입니다.이 MixerThread는 AudioFlinger::BaseThread에서 상속됩니다.그런 다음, 당신의 가장 좋은 편집기 (정력, 이맥스, gedit를, 무엇이든)와 키워드를 mOutput->write 를 검색하고, 우리는 threadLoop() 기능에 따라이 같은 뭔가를 발견 할 것이다 : 바로 그 점이다

mLastWriteTime = systemTime(); 
mInWrite = true; 
mBytesWritten += mixBufferSize; 

int bytesWritten = (int)mOutput->write(mMixBuffer, mixBufferSize); 
if (bytesWritten < 0) mBytesWritten -= mixBufferSize; 
mNumWrites++; 
mInWrite = false; 

믹서 출력 버퍼는 내가 생각하는 하드웨어 관련 코드로 전송되고 오디오 클립은 이고 크기는 mixBufferSize입니다. 이 버퍼에는 44100Hz 샘플링 속도, 2 채널 및 16 비트 리틀 엔디안을 매개 변수로 갖는 PCM 원시 오디오 데이터가 있습니다. 변환하기 위해,
aplay -t raw -c 2 -f S16_LE -r 44100 wav.raw

어쨌든 : 당신이 /data/wav.raw 같은 파일로 출력 버퍼를 작성하는 경우 , 당신은 당신의 호스트 컴퓨터에 데이터 파일을 검색하고 aplay으로 재생 ADB 풀을 사용할 수 있습니다 mp3하려면 마이클이 말한 것처럼 외부 인코더를 사용해야합니다.