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();
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. –
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
può StraightFright eseguire il rendering di un video utilizzando le immagini ?? –