Android MediaCodec: réduisez la taille de la vidéo mp4

Je cherche un moyen de "compresser" une vidéo mp4. Pour ce faire, je souhaite réduire la résolution de la vidéo et / ou réduire les FPS.

Après une longue recherche, je pense que la façon de le faire est d'utiliser MediaCodec et les API connexes comme suit:

  • Animateur Android versus animations de ressources animées
  • Run-as Package 'abc' est inconnu - Galaxy S4 Jellybean ou Android 4.3
  • Mot de passe oublié Keystore, en pensant à la détection de Brute-Force. Va-t-il corrompre le magasin de clés?
  • Dessiner du texte à l'intérieur d'un arc en utilisant un canevas
  • Utilisation des attributs du niveau API au-delà de minSdkVersion
  • Insérer des annonces dans Recyclerview
  • -> MediaExtractor pour extraire les données multimédia encodées à partir d'un fichier mp4. -> MediaCodec (Décodeur): Décodez chaque image pour un traitement ultérieur. -> MediaCodec (Encoder): À ce stade, je suppose que c'est là que l'on devrait établir des paramètres MediaFormat tels que la résolution vidéo, ce qui devrait nous aider à réduire la taille finale du fichier mp4. -> MediaMuxer pour générer le fichier mp4 (MinSDK 18, cela pourrait être un problème, mais pour l'instant … ok).

    Je ne veux pas utiliser une SurfaceView / TextureView. En ce qui concerne l'audio, je ne veux pas le traiter pour réduire la qualité.

    J'ai examiné tous les exemples ici: http://bigflake.com/mediacodec/

    J'ai également vu des modules de code source CTS.

    Et j'ai examiné plusieurs projets comme ceux-ci: https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java

    Et bien sûr, j'ai lu des dizaines de messages sur stackoverflow.

    Le problème est que je n'ai pas encore trouvé d'exemple de code qui fonctionne bien pour ce porpuse. J'ai essayé de prendre divers morceaux de code et de les mettre ensemble sur un projet, mais ne fonctionne pas vraiment.

    Merci.

  • Pourquoi TextView en une seule ligne a-t-il été imprimé avec des cases "fin"?
  • Utilisation d'un Gif animé comme superpositions au sol dans G. Maps v2
  • Android: désactivez la sélection de texte dans une vue web
  • Lisez le flux deux fois
  • Android dessine le texte en rectangle sur le centre et recadré si nécessaire
  • Titre du centre de la barre d'outils Android et police personnalisée
  • One Solution collect form web for “Android MediaCodec: réduisez la taille de la vidéo mp4”

    Le point le plus proche de ce que vous voulez est probablement DecodeEditEncodeTest sur bigflake. Vous n'avez pas besoin de SurfaceView ou TextureView , car vous TextureView pas d'afficher la vidéo, mais vous devrez utiliser un SurfaceTexture .

    Le code de test génère une vidéo, puis décode / édite / encode, puis teste la sortie codée. Vous voulez la partie decode-edit-encode. Lors de la création de l'encodeur, donnez-le quelle que soit la taille souhaitée. La surface d'entrée qu'il crée sera dimensionnée pour correspondre. La mise à l'échelle est effectuée par le GPU car elle rend la texture GL (du SurfaceTexture ) sur la surface d'entrée du codeur. Vous devrez décider si le filtrage linéaire GLES fournit le niveau de qualité dont vous avez besoin.

    (Vous pouvez voir quelque chose de similaire dans ExtractMpegFramesTest , qui fait passer tout à 640×480 en effectuant l'extraction. Dans ce cas, il convertit les images en PNG plutôt que de les alimenter en codeur, donc ce n'est pas applicable à votre situation.)

    Le renversement des images est théoriquement simple: ne le soumettez pas au codeur. En pratique, c'est un peu plus difficile si l'entrée comporte des cadres irrégulièrement espacés. Si l'entrée est "frame1 frame2 … pause … frame4 frame5", et vous déposez frame2, vous finirez en pause sur frame1, ce qui pourrait sembler étrange. Vous pouvez utiliser les horodatages de présentation pour trouver le calendrier.

    L'entrée de surface et MediaMuxer (requis pour sauvegarder H.264 en tant que .mp4) nécessitent l'API 18+. Pour les anciennes versions d'Android, vous voudrez probablement utiliser une bibliothèque tierce comme ffmpeg .

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