2

J'utilise l'API Camera2 avec l'aide des deux exemples que vous pouvez trouver ici:image Android Camera2 est records en noir et vidéo uniquement 1sec

J'utilise code source identique comme dans les liens ci-dessus, donc je ne copierai pas ma Source ici (sauf si vous avez besoin de certaines parties, je vais éditer ma question et l'afficher).

EDIT:

Ran quelques tests. Lorsque j'essaie de lire la vidéo via mon téléphone, elle affiche uniquement la première image et j'entends les sons (voix) qui étaient réellement dans l'enregistrement. Une fois la vidéo terminée, la vidéo redémarre automatiquement et affiche la vidéo comme il se doit.

Toutefois, lorsque j'essaie de lire la vidéo sur mon PC (en la copiant du téléphone vers le bureau), l'écran noir ne s'affiche que jusqu'à la dernière image. La dernière image est affichée, mais la vidéo ne joue pas du tout. Je peux entendre Audio (voix) tho.

Je pense peut-être qu'il y a un problème avec certains encodage/décodage vidéo?

NUMÉRO:

Dans mon cas, l'enregistrement de la vidéo ne fonctionne pas. Je peux voir les deux fichiers dans le répertoire qu'ils devraient être sur mon téléphone, mais quand je joue la vidéo (5 secondes vidéo) 4 premières secondes sont noirs, puis dernière seconde est comme une image de ce que j'ai enregistré et c'est tout, mais la taille du fichier semble énorme (160 Mo).

ECRANS:

  • afficherons vidéo une fois téléchargés

Je ne sais pas quel est le problème, quelqu'un peut-il s'il vous plaît aider?

+0

J'ai réussi pour corriger certaines de mes erreurs de prise de vue. Cependant, j'ai maintenant importé l'exemple Sample for Camera2Video et le problème est le même. Donc, probablement, quelque chose ne va pas dans l'exemple source de Camera2Video. Je vais essayer de trouver quoi. –

+0

Hey! Utilisez-vous basique et vidéo à la fois dans un endroit? J'ai un problème pour utiliser les deux dans le même fragment. Je ne vais pas voir seul dans quel utilisateur peut prendre des photos OU enregistrer des vidéos. Peux-tu aider s'il te plait? –

Répondre

4

Ce n'est pas une vraie solution, mais il a quand même fait l'affaire pour ce que je voulais faire.

Pour lire la vidéo que je devais AUDIO DISABLE ENTIEREMENT dans ma configuration MediaRecorder:

 //mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setOutputFile(getVideoFile(activity).getAbsolutePath()); 
     mMediaRecorder.setVideoEncodingBitRate(10000000); 
     mMediaRecorder.setVideoFrameRate(24); 
     mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight()); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
     //mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

Vous pouvez remarquer où je peux commenté commandes. Une fois que j'ai fait cela, la vidéo joue normalement.

Espérons que cela mauvais solution de contournement aidera encore quelqu'un qui ne nécessite pas d'audio dans l'enregistrement vidéo.

+0

J'ai un problème identique. Je pense que c'est lié au matériel. Je reçois le problème sur mon Galaxy S7 mais pas sur ma tablette Nexus. Analyser le fichier vidéo, je trouve que le framerate et le framerate minimum est de 0 fps, même si je fixe le framerate à 30. Android camera2 api galaxy s7 – user3561494

1

Sur certains appareils, notamment la série Galaxy, S7, etc., l'enregistreur de médias donne un mauvais horodatage à la piste vidéo. cela provoque la lecture de l'audio en premier suivi de la vidéo.Pour résoudre ce problème, vous devez réorganiser la sortie générée par l'enregistreur multimédia et réécrire les horodatages vidéo, en commençant par l'heure 0. Cela corrigera le problème de synchronisation audio vidéo que vous avez signalé ci-dessus.

+0

S'il vous plaît donner quelques conseils sur la façon de réorganiser la sortie. – user3561494

1

Le Samsung Galaxy S7 (et S6 je pense) a un bug qui gâche l'encodage. La solution est de réencoder en utilisant la fonction ci-dessous.

Notez que vous avez besoin de cette dépendance dans votre gradle: compilation 'com.googlecode.mp4parser: isoparser: 1.1.22'

public void fixSamsungBug() 
{ 
    DataSource channel = null; 
    try 
    { 
     channel = new FileDataSourceImpl(app.dataMgr.videoFileURL); 
    } catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 

    IsoFile isoFile = null; 

    try 
    { 
     isoFile = new IsoFile(channel); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class); 
    boolean sampleError = false; 
    for (TrackBox trackBox : trackBoxes) { 
     TimeToSampleBox.Entry firstEntry = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox().getTimeToSampleBox().getEntries().get(0); 

     // Detect if first sample is a problem and fix it in isoFile 
     // This is a hack. The audio deltas are 1024 for my files, and video deltas about 3000 
     // 10000 seems sufficient since for 30 fps the normal delta is about 3000 
     if(firstEntry.getDelta() > 10000) { 
      sampleError = true; 
      firstEntry.setDelta(3000); 
     } 
    } 

    if(sampleError) { 
     Log.d("gpinterviewandroid", "Sample error! correcting..."); 
     Movie movie = new Movie(); 
     for (TrackBox trackBox : trackBoxes) { 
      movie.addTrack(new Mp4TrackImpl(channel.toString() + "[" + trackBox.getTrackHeaderBox().getTrackId() + "]" , trackBox)); 
     } 
     movie.setMatrix(isoFile.getMovieBox().getMovieHeaderBox().getMatrix()); 
     Container out = new DefaultMp4Builder().build(movie); 

     //delete file first! 
     File file = new File(app.dataMgr.videoFileURL); 
     boolean deleted = file.delete(); 


     FileChannel fc = null; 
     try 
     { 
      //fc = new FileOutputStream(new File(app.dataMgr.videoFileURL)).getChannel(); 
      fc = new RandomAccessFile(app.dataMgr.videoFileURL, "rw").getChannel(); 
     } catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 

     try 
     { 
      out.writeContainer(fc); 
      fc.close(); 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     Log.d("gpinterviewandroid", "Finished correcting raw video"); 
    } 
} 
+0

Cela n'a pas résolu ma vidéo, êtes-vous sûr que cela fonctionne? Merci –

+0

Le problème est que ce code change mes métadonnées. C'était MPEG 4 et maintenant le fichier semble corrompu. Toute solution? –

-1

Ce code fonctionne pour moi:

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
+0

Ceci ne fournit pas de réponse à la question. Une fois que vous avez suffisamment [réputation] (https://stackoverflow.com/help/whats-reputation) vous pourrez [commenter n'importe quel article] (https://stackoverflow.com/help/privileges/comment); Au lieu de cela, [fournissez des réponses qui ne nécessitent pas de précisions de la part du demandeur] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- je-fais-à la place). - [De l'examen] (/ review/low-quality-posts/17910725) – GoodSp33d