5

Czy można nagrywać wewnętrzny dźwięk generowany przez aplikację?Nagrywanie/przechwytywanie wewnętrznego odtwarzania dźwięku aplikacji na Androida i eksportowanie plików MP3?

Moja aplikacja umożliwia tworzenie i odtwarzanie sekwencji muzycznych.

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

Chciałbym móc nagrać sekwencję i eksport do mp3.

Przyjrzeliśmy się Audio Capture ale setAudioSource (int audio_source) wydaje się tylko, aby zaakceptować nagranie MIC.

Dzięki

Odpowiedz

3

Nie, nie ma API dla coraz wyjście audio, nawet dla własnej aplikacji (właściwie to nie do końca prawda, bo można je dostać za pośrednictwem Visualizer API, ale byłoby takiej niskiej jakości że wątpię, by był dla ciebie przydatny).

Jeśli chcesz tego rodzaju funkcjonalność, musisz go zaimplementować samodzielnie. To jest; gdy zaczniesz odtwarzanie dźwięków, wymieszaj je i zapisz wynik również do pliku. Jeśli dźwięki są skompresowane, będziesz musiał również zdekodować je sam.

Zauważ, że nie ma kodera MP3 zawarte z Androidem, więc trzeba by dostarczyć swój własny koder MP3 w każdym razie jeśli to format chcesz wyeksportować w.

+0

Podziękowania dla Michaela - każdy pomysł, od którego najlepiej zacząć (dokumentacja, samouczki itp.), Ponieważ nie mam pojęcia, jak miksować dźwięki i zapisywać je w pliku? – fxfuture

+0

Najprostszym scenariuszem byłoby, gdyby wszystkie twoje dźwięki były nieprzetworzonym PCM o tej samej częstotliwości próbkowania, liczbie kanałów itp .; i użyłeś podstawowego miksera dodatków. Twoje miksowanie polegałoby wówczas na pobraniu próbki z każdego aktualnie aktywnego dźwięku i dodaniu ich razem, a następnie przy użyciu standardowych interfejsów API pliku Java do zapisania wyniku w pliku. Należy zachować ostrożność, aby upewnić się, że dodatek nie zostanie przepełniony. Jeśli zaczniesz zajmować się kodowaniem i dekodowaniem, stanie się bardziej skomplikowany. Możesz znaleźć przydatne informacje, jeśli google, np. dla "ffmpeg mp3 android" lub "miksowanie dźwięku". – Michael

+1

Bardzo pomocne dzięki. Znalazłem to na początek - http://mobilengineering.blogspot.it/2012/06/audio-mix-and-record-in-android.html – fxfuture

1

Jak powiedział Michael, u trzeba zaimplementować własny koder i dekoder do tego. Wizualizator zapewnia bardzo niską jakość danych, ponieważ możemy wykorzystać go do wyświetlania niestandardowych widoków i efektów, które są zsynchronizowane z korektorem.

To jest link gdzie znajdziesz prosty dekoder i koder dla pliku MP3. Gdzie czytają dane z pliku MP3 i umieszczają je w nowym pliku MP3. Stworzyli także wsparcie dla innego rozszerzenia.

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

0

Według http://xzpeter.org/?p=254 to możliwe, aby uchwycić odtwarzanie dźwięku wewnętrznego jeśli zmodyfikować źródła Androida. W szczególności funkcja zapisu klasy AudioFlinger::MixerThread. (Zauważ, że artykuł jest trochę stary - na najnowszych wersjach Androida zmieniono organizację AudioFlinger, a kod zapisu można teraz znaleźć w funkcji threadLoop_write()).

Cytowanie rozwiązanie oryginalny autor:

AudioFlinger jest realizowany w ramach reż frameworks/base/services/audioflinger/. To, co zamierzamy zrobić, to znaleźć wyjście miksera. W pliku AudioFlinger.cpp możemy zobaczyć AudioFlinger::MixerThread::threadLoop(), który jest działającym wątkiem miksera, a ten MixerThread jest dziedziczony od AudioFlinger::BaseThread.Następnie wystarczy poszukać słowa kluczowego mOutput->write z najlepszym edytora (vim, emacs, gedit, cokolwiek), a my znajdziemy coś takiego pod threadLoop() funkcję:

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

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

To jest właśnie punkt, że wyjścia miksera Bufor jest przenoszony do kodów sprzętowych, myślę, i klip audio jest w mMixbuffer, o rozmiarze mixBufferSize. W tym buforze znajdują się nieprzetworzone dane audio PCM o częstotliwości próbkowania 44100 Hz, 2 kanałach i 16 bitach little endian jako jego parametry. Jeśli piszesz ten bufor do pliku, jak /data/wav.raw, można po prostu użyć adb ciągnąć, aby pobrać plik danych do komputera hosta i odtworzyć go z aplay:
aplay -t raw -c 2 -f S16_LE -r 44100 wav.raw

W każdym razie, w celu przekształcenia do mp3 będziesz musiał użyć zewnętrznego kodera, jak stwierdził Michael.