2015-10-07 1 views
2

J'essaie d'enregistrer de la vidéo en utilisant OpenCV avec des données superposées. J'ai ajouté OpenCV à mon projet et obtenir l'aperçu de la caméra avec succès. En cherchant comment puis-je enregistrer une vidéo, je suis tombé sur JavaCV. JavaCV a une activité sapmle appelée RecordActivity pour faire la démonstration de l'enregistrement vidéo. Il ajoute un CameraView dynamiquement avec du code et obtient des cadres de caméra et les enregistre dans la méthode onPreviewFrame du CameraView. Vous pouvez voir le code complet ici:Android: FFmpegFrameRecorder (JavaCV) UnsatisfiedLinkError

RecordAvtivity.java

Ce que je veux faire est d'enregistrer des vidéos en onCameraFrame metod de l'interface CvCameraViewListener2 au lieu de onPreviewFrame metod du PreviewCallback.

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    final Mat rgba = inputFrame.rgba(); 
    Core.flip(rgba, rgba, 1); 
    // Overlay some text and record video here. 
    return rgba; 
} 

JavaCV enregistrement bloc de code de RecordAvtivity.java

public void onPreviewFrame(byte[] data, Camera camera) { 

    if (audioRecord == null || audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) { 
     startTime = System.currentTimeMillis(); 
     return; 
    } 

    int i = imagesIndex++ % images.length; 
    Frame yuvImage = images[i]; 
    timestamps[i] = 1000 * (System.currentTimeMillis() - startTime); 

    /* get video data */ 
    if (yuvImage != null && recording) { 
     ((ByteBuffer) yuvImage.image[0].position(0)).put(data); 

     try { 
      Log.v(TAG, "Writing Frame"); 
      long t = 1000 * (System.currentTimeMillis() - startTime); 

      if (t > recorder.getTimestamp()) { 
       recorder.setTimestamp(t); 
      } 

      recorder.record(yuvImage); 
     } catch (FFmpegFrameRecorder.Exception e) { 
      Log.v(TAG, e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 

JavaCV a besoin de données comme byte[] mais j'ai Mat objet. Je dois centrer entre eux efficacement.

Comment puis-je faire cela?

MISE À JOUR:

J'ai utilisé la solution suivante pour résoudre mon problème initial

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    final Mat rgba = inputFrame.rgba(); 
    Core.flip(rgba, rgba, 1); 

    if (data == null) { 
     data = new byte[(int)rgba.total() * rgba.channels()]; 
    } 

    rgba.get(0,0, data); 
    record(data); 
    return rgba; 
} 

public void record(byte[] data) { 

    if (audioRecord == null || audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) { 
     startTime = System.currentTimeMillis(); 
     return; 
    } 

    int i = imagesIndex++ % images.length; 
    Frame yuvImage = images[i]; 
    timestamps[i] = 1000 * (System.currentTimeMillis() - startTime); 

    /* get video data */ 
    if (yuvImage != null && recording) { 
     ((ByteBuffer) yuvImage.image[0].position(0)).put(data); 

     try { 
      Log.v(TAG, "Writing Frame"); 
      long t = 1000 * (System.currentTimeMillis() - startTime); 

      if (t > recorder.getTimestamp()) { 
       recorder.setTimestamp(t); 
      } 

      recorder.record(yuvImage); 
     } catch (FFmpegFrameRecorder.Exception e) { 
      Log.v(TAG, e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 

mais maintenant j'obtiens l'erreur suivante:

FATAL EXCEPTION: main 
E/AndroidRuntime: Process: com.yceo.anlatbana, PID: 17622 
E/AndroidRuntime: java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avutil 
E/AndroidRuntime:  at java.lang.Class.classForName(Native Method) 
E/AndroidRuntime:  at java.lang.Class.forName(Class.java:309) 
E/AndroidRuntime:  at org.bytedeco.javacpp.Loader.load(Loader.java:390) 
E/AndroidRuntime:  at org.bytedeco.javacpp.Loader.load(Loader.java:358) 
E/AndroidRuntime:  at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1407) 
E/AndroidRuntime:  at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149) 
E/AndroidRuntime:  at com.yceo.anlatbana.GameFragment.initRecorder(GameFragment.java:267) 
E/AndroidRuntime:  at com.yceo.anlatbana.GameFragment.onCreate(GameFragment.java:98) 
E/AndroidRuntime:  at android.support.v4.app.Fragment.performCreate(Fragment.java:1939) 
E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:988) 
E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1207) 
E/AndroidRuntime:  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1572) 
E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:493) 
E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5310) 
E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

J'ai essayé solution d'en bas question mais cela n'a pas fonctionné:

JavaCV configuration in Android Studio

J'ai également essayé l'installation manuelle et progressive pour JavaCV mais aucun d'eux n'a fonctionné.

J'utilise:

  • Android studio 1.4
  • OpenCV 3.0
  • JavaCV 1,0
+0

http://answers.opencv.org/question/4761/mat-to-byte-array/ – Miki

+0

Utilisez-vous Proguard? –

+0

Oui. Mais j'ai essayé de le désactiver, ne fonctionnait pas. –

Répondre

0

ajouter ces lignes à des dépendances

compile 'org.bytedeco.javacpp-presets:opencv:3.0.0-1.1:android-arm' 
compile 'org.bytedeco.javacpp-presets:ffmpeg:2.8.1-1.1:android-arm' 

et ajoutez packagingOptions intérieur android {}

packagingOptions{} 

et ajouter ces lignes à packagingOptions

exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties' 
exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties' 
exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml' 
exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml' 

Il travaille pour moi. J'espère que c'est utile pour vous.