2012-03-23 10 views
14

Attualmente sto sviluppando un'applicazione che ha bisogno di registrare audio, codificarlo come AAC, trasmetterlo in streaming e fare lo stesso in modalità inversa, ricevendo streaming, decodificando AAC e riproducendo audio.Android: include le funzionalità native StageFright nel mio progetto

Ho registrato con successo AAC (avvolto in un contenitore MP4) utilizzando MediaRecorder e audio con upstream con successo utilizzando la classe AudioRecord. Ma, ho bisogno di essere in grado di codificare l'audio mentre lo streaming, ma nessuna di queste classi sembra aiutarmi a farlo.

Ho studiato un po 'e ho scoperto che molte persone che hanno questo problema finiscono per utilizzare una libreria nativa come ffmpeg.

Ma mi chiedevo, dal momento che Android include già Stagefright, che ha codice nativo che può fare la codifica e decodifica (per esempio, AAC encoding e AAC decoding), c'è un modo per utilizzare questo codice nativo alla mia domanda? Come lo posso fare?

Sarebbe bello se avessi solo bisogno di implementare alcune classi JNI con il loro codice nativo. Inoltre, poiché è una libreria Android, non ci sarebbero problemi di licenza (correggimi se sbaglio).

risposta

16

sì, è possibile utilizzare libstagefright, è molto potente.

Poiché stagefright non è esposto a NDK, quindi dovrai fare del lavoro extra.

Ci sono due modi:

(1) costruire il tuo progetto utilizzando Android albero sorgente completo. In questo modo sono necessari pochi giorni per l'installazione, una volta pronto, è molto semplice e puoi sfruttare appieno i vantaggi del palcoscenico.

(2) solo è possibile copiare file include nel progetto, è all'interno di questa cartella:

Android-4.0.4_r1.1/quadri/base/include/media/stagefright

allora si avrà hai esportato la funzione della libreria caricando dinamicamente libstagefright.so e puoi collegare con il tuo progetto jni.

Per codificare/decodificare utilizzando statgefright, è molto semplice, possono fare alcune centinaia di righe.

Ho utilizzato stagefright per acquisire schermate per creare un video, che sarà disponibile nel nostro server VNC Android, che verrà rilasciato a breve.

il seguente è uno snippet, penso sia meglio che utilizzare ffmpeg per codificare un film. Puoi anche aggiungere una sorgente audio.

class ImageSource : public MediaSource { 
    ImageSource(int width, int height, int colorFormat) 
    : mWidth(width), 
     mHeight(height), 
     mColorFormat(colorFormat) 
    { 
    } 

    virtual status_t read(
     MediaBuffer **buffer, const MediaSource::ReadOptions *options) { 
     // here you can fill the buffer with your pixels 
    } 

    ... 
}; 

int width = 720; 
int height = 480; 
sp<MediaSource> img_source = new ImageSource(width, height, colorFormat); 

sp<MetaData> enc_meta = new MetaData; 
// enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263); 
// enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 
enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 
enc_meta->setInt32(kKeyWidth, width); 
enc_meta->setInt32(kKeyHeight, height); 
enc_meta->setInt32(kKeySampleRate, kFramerate); 
enc_meta->setInt32(kKeyBitRate, kVideoBitRate); 
enc_meta->setInt32(kKeyStride, width); 
enc_meta->setInt32(kKeySliceHeight, height); 
enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec); 
enc_meta->setInt32(kKeyColorFormat, colorFormat); 

sp<MediaSource> encoder = 
    OMXCodec::Create(
      client.interface(), enc_meta, true, image_source); 

sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/screenshot.mp4"); 
writer->addSource(encoder); 

// you can add an audio source here if you want to encode audio as well 
// 
//sp<MediaSource> audioEncoder = 
// OMXCodec::Create(client.interface(), encMetaAudio, true, audioSource); 
//writer->addSource(audioEncoder); 

writer->setMaxFileDuration(kDurationUs); 
CHECK_EQ(OK, writer->start()); 
while (!writer->reachedEOS()) { 
    fprintf(stderr, "."); 
    usleep(100000); 
} 
err = writer->stop(); 
+2

Durante la copia, fare attenzione che la funzione JNI sia C e Stagefright sia C++. Alcune delle intestazioni dipendenti che Stagefright inserisce sembrano incompatibili con l'ambiente NDK per JNI. –

+2

Nota che non tutti i dispositivi Android hanno stage stage e l'API varia a seconda della versione. Fai molta attenzione in quanto non esiste un contratto per queste API, quindi potrebbero non essere stabili. – dagalpin

+0

può StraightFright eseguire il rendering di un video utilizzando le immagini ?? –

Problemi correlati