2016-04-15 7 views

Antwort

3

Sie können die javacv-Bibliothek verwenden, um eine Reihe von Bitmaps zu kombinieren, die aus der Ansicht stammen. der Code wird wie folgt aussehen:

FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("/sdcard/test.mp4",256,256); 
try { 
    recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); 
    recorder.setFormat("mp4"); 
    recorder.setFrameRate(30); 
    recorder.setPixelFormat(avutil.PIX_FMT_YUV420P10); 
    recorder.setVideoBitrate(1200); 
    recorder.startUnsafe(); 
    for (int i=0;i< 5;i++) 
    { 
     view.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     view.setDrawingCacheEnabled(false); 
     recorder.record(bitmap); 
    } 
    recorder.stop(); 
} 
catch (Exception e){ 
    e.printStackTrace(); 
} 

Und hier ist ein full example wie

+0

Danke für Ihre Antwort! Ich habe versucht, die Bibliothek zu benutzen. Es scheint, dass es für mich richtig ist. Aber ich habe eine Frage, ist es möglich, 30 Bitmaps pro Sekunde aufzunehmen? Andernfalls "Bitmap.createBitmap (view.getDrawingCache());" 30 Mal in einer Sekunde aufzurufen? Wie kann es die Leistung beeinflussen? – theaibek

+1

Was ist v1? Diese API funktioniert nicht mehr. recoder.record nimmt keine Bitmap. –

+0

@ JeffreyLiu 'v1' ist Ihre Ansicht von dem, was Sie einen Bildschirm nehmen möchten =) – theaibek

3

Sie können Screenshots der Ansichten Ihrer App mit einem well-known technique erhalten. Wenn Sie mehrere aufeinanderfolgende Bilder aufnehmen, können Sie diese zu einem Video kombinieren.

Wenn Sie dies live mit einer höheren Bildrate machen möchten, empfiehlt es sich, eine virtuelle Anzeige über die Klasse MediaProjection zu verwenden, die den Ausgang in einen Videoencoder einspeist. Dies erfordert API 21.

Für die Aufzeichnung des Bildschirms auf einem API 16-Gerät ist systemeigener Code und die Verwendung von non-public interfaces erforderlich. Es ist möglich, aber nicht einfach.

+0

Vielen Dank für Ihre schnelle Antwort aufzunehmen! Ich habe die Optionen zur Verwendung dieser Technik (Video von Bildern) in Betracht gezogen, wie Sie und @androidLover vorgeschlagen haben. Aber ich denke, dass diese Option für mein Problem nicht das beste wäre, weil ich mit einer hohen Bildrate erfassen muss. Ich nehme an, Encoder hat keine Zeit, um mit 30 Bildern pro Sekunde aufzuzeichnen. Ist es so? – theaibek

+0

Der Hardware-Video-Codec kann mit 30 fps bei einer vernünftigen Auflösung (720p oder 1080p) auf den meisten Geräten mithalten. Das Problem ist, dass die Frames gerendert und so schnell in den Encoder übertragen werden. Sie möchten wirklich alle Daten in der GPU und im video Codec behalten. – fadden

+0

Hi @fadden bitte näher auf den 'MediaProjection'-Ansatz eingehen. Eine Art Code-Snippet wäre sehr hilfreich. –