Utilisation de Android MediaRecorder

Voici la structure de mon code de travail pour enregistrer la vidéo et l'audio:

Questions: 1) Pourquoi le CamcorderProfile nécessaire? setProfile(...) semble définir les dimensions de ce que QUALITY_HIGH donne, mais plus tard, je définis les dimensions que je veux avec setVideoSize(...) , ce qui remplace celle-ci. Cependant, lorsque je supprime les deux lignes CamcorderProfile, l'application se bloque à setVideoSize(...) avec LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2 .

  • Mode correct de configuration du cache pour OkHttp dans Android
  • Récupérer les données du site Web dans l'application Android
  • Supprimer le projet d'Android Studio
  • Android Fragment, remontant sans recréer / recharger Fragment
  • Mise en œuvre du menu d'action flottante à l'aide du bouton d'action Float de la bibliothèque de support de conception Android
  • Comment le comportement de DrawableStart ne correspond pas à la documentation Android?
  • 2) Comment ne pas enregistrer d'audio? La documentation indique que si setAudioSource(...) n'est pas appelé, il n'y aura pas de piste audio. Cependant, lorsque je supprime cette ligne, l'application se bloque à setProfile(...) avec LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first .

    3) Si je supprime les deux lignes CamcorderProfile et la ligne setAudioSource(...) , elle se bloque comme dans 1).

    4) J'ai également essayé d'ajouter la ligne

     recorder.setOutputFormat(OutputFormat.DEFAULT); 

    Au lieu des lignes CamcorderProfile. Mais maintenant, il se bloque à perpare() . Si setAudioSource(...) s'appelle LogCat est: E/MediaRecorder(20737): audio source is set, but audio encoder is not set si ce n'est pas appelé LogCat est: E/MediaRecorder(20544): video source is set, but video encoder is not set

    J'ai regardé partout l'Internet et je ne trouve pas un bon exemple de la manière correcte de configurer MediaRecorder. Ici, cela implique après l'API 8, vous devez utiliser la classe CamcorderProfile, mais il me semble que cela pose des problèmes.

    Toute aide est la bienvenue! Merci!

    Code (qui fonctionne lorsqu'il est exécuté comme ci-dessous):

     recorder = new MediaRecorder(); recorder.setCamera(<<camera>>); recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); recorder.setProfile(profile); recorder.setOutputFile(<<Path String>>); recorder.setVideoSize(<<Width>>, <<Height>>); recorder.setPreviewDisplay(<<Surface>>); recorder.setOrientationHint(0); recorder.setMaxDuration(10000); recorder.setOnInfoListener(this); try { recorder.prepare(); recorder.start(); } catch ... 

  • Android Native Build Problème d'erreur lors de la création de l'apk
  • Comment obtenir une liste d'applications Android installées et choisir une à exécuter
  • Impossible de mettre à jour Android Studio - uniquement le téléchargement
  • Android Justify spanable Vue de texte qui prend en charge les langues RTL
  • Erreur de mémoire morte Lors du chargement de plus d'images dans Glide
  • Pourquoi Android tronque mon titre ActionBar?
  • One Solution collect form web for “Utilisation de Android MediaRecorder”

    Je n'ai pas beaucoup d'expérience avec MediaRecorder mais je lisais des sujets connexes et j'essaierai de répondre à vos questions:

    1, 3 et 4) CamcorderProfile définit plus que la résolution, il définit également les choses comme format de sortie et encodeurs (audio et vidéo). Vous obtenez l'erreur car vous devez probablement utiliser setOutputFormat avant d'appeler setVideoSize et vous devez appeler setVideoEncoder et setAudioEncoder après cela, si vous ne souhaitez pas utiliser CamcorderProfile. [Selon cette réponse ]

    2) Encore une fois, CamcorderProfile définit également des propriétés audio (telles que Codec, BitRate, SampleRate, …), donc vous devez définir une source audio avant de l'appeler, c'est pourquoi l'application s'est écrasée. Si vous ne souhaitez pas enregistrer d'audio, essayez le prochain code: (je ne l'ai pas testé, donc je ne sais pas si cela fonctionne, mais je ne suis pas sûr de le faire)

     recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setVideoSize(WIDTH, HEIGHT); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); recorder.setOutputFile(PATH); recorder.setPreviewDisplay(SURFACE); recorder.prepare(); recorder.start(); 

    Notez également que si vous ne souhaitez pas utiliser CamcorderProfile (c'est-à-dire que vous souhaitez enregistrer de l'audio ou de la vidéo uniquement), vous devrez peut-être définir des paramètres supplémentaires pour vous assurer de la qualité souhaitée. Jetez un coup d'œil au code d'exemple suivant:

     recorder = new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); // Following code does the same as getting a CamcorderProfile (but customizable) recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // Video Settings recorder.setVideoSize(WIDTH, HEIGHT); recorder.setVideoFrameRate(FRAME_RATE); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); recorder.setVideoEncodingBitRate(VIDEO_BITRATE); // Audio Settings recorder.setAudioChannels(AUDIO_CHANNELS); recorder.setAudioSamplingRate(SAMPLE_RATE); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); recorder.setAudioEncodingBitRate(AUDIO_BITRATE); // Customizable Settings such as: // recorder.setOutputFile(PATH); // recorder.setPreviewDisplay(SURFACE); // etc... // Prepare and use the MediaRecorder recorder.prepare(); recorder.start(); ... recorder.stop(); recorder.reset(); recorder.release(); 

    J'espère que ceci vous aide.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.