2016-01-04 5 views
0

Je veux créer une vidéo (mp4) à partir d'un ensemble d'images et je veux y ajouter un bruit de fond. Le bruit de fond peut soit être enregistré ou un fichier peut être parcouru en utilisant un sélecteur de contenu dans Android. Le code suivant crée la vidéo lorsqu'un nouvel enregistrement audio est enregistré au format 3gp. Cependant lorsque je parcours un fichier audio (mp3 par exemple), il montre cette erreur et la vidéo enregistrée ne peut pas être lue.avcodec_encode_video2() erreur -1: Impossible de coder le paquet vidéo - javacv

l'erreur est montré:

org.bytedeco.javacv.FrameRecorder$Exception: avcodec_encode_video2() error -1: Could not encode video packet. :at video_settings$Generate.doInBackground(video_settings.java:298) 

le code à video_settings.java:298 est

    recorder.record(frame2); 

code correspondant est:

protected Void doInBackground(Void... arg0) { 


     try { 
      FrameGrabber grabber1 = new FFmpegFrameGrabber(paths.get(0)); 
      FrameGrabber grabber2 = new FFmpegFrameGrabber(backgroundSoundPath); 
      Log.d("hgbj", backgroundSoundPath); 
      grabber1.start(); 
      grabber2.start(); 

      FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(video, 320, 
        240, grabber2.getAudioChannels());// 320, 240 
      recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);// 
      recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); 
      recorder.setFormat("mp4"); 
      recorder.setFrameRate(2); 
      recorder.setVideoBitrate(10 * 1024 * 1024); 

      recorder.start(); 
      Frame frame1, frame2; 
      long timeLength = grabber2.getLengthInTime(); 
      System.out.println("total time = " + timeLength); 


      for (int i = 0; i < paths.size(); i++) { 
       // record this frame and then record (numFrames*percentageTime[i]/100) number of frames of the audio. 
       frame1 = grabber1.grabFrame(); 
       long startTime = System.currentTimeMillis(); 
       recorder.setTimestamp(startTime * 1000); 
       recorder.record(frame1); 
       boolean first = true; 
       // while current time - start time < percentage time * total time/100: record frame2 
       long temp = timeLength * percentageTime[i]/100000 + startTime; 
       while (System.currentTimeMillis() <= temp) { 
        frame2 = grabber2.grabFrame(); 
        if (frame2 == null) break; 
        if (first) { 
         recorder.setTimestamp(startTime * 1000); 
         first = false; 
        } 
        recorder.record(frame2); 
       } 
       if (i < paths.size() - 1) { 
        grabber1.stop(); 
        grabber1 = new FFmpegFrameGrabber(paths.get(i + 1)); 
        grabber1.start(); 
       } 
      } 

Ma question est: si son travail pour les fichiers enregistrés 3gp pourquoi ne fonctionne-t-il pas pour les fichiers mp3 parcourus et que dois-je faire pour le faire fonctionner? J'ai essayé de changer les codecs, la largeur de la hauteur du cadre, le débit vidéo, mais je ne connais aucun moyen de déterminer quel bitrate etc est compatible avec un codec/format donné. Je suis en train de changer le contenu uri obtenu à partir du navigateur de fichiers dans le chemin réel de sorte que ce n'est pas le problème.

Répondre

0

Vous pouvez essayer d'utiliser un autre codec vidéo. J'ai moi-même réglé le codec vidéo sur AV_CODEC_ID_H264 pour résoudre le problème. Donc, vous pourriez essayer comme ceci:

recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);