Android MediaCodec: Reduzieren Sie den mp4-video-Größe
Ich bin auf der Suche nach einem Weg zu "komprimieren" ein mp4-video. Um dies zu erreichen, möchte ich, um die Auflösung des video-und /oder Verringerung der FPS.
Nach langen Recherchen, ich denke, die Art und Weise, es zu tun, ist die Verwendung von MediaCodec und die zugehörigen APIs wie folgt :
-> MediaExtractor zum extrahieren von codierten media-Daten aus einer mp4-Datei.
-> MediaCodec (Decoder): Dekodierung jedes Frames für die spätere Verarbeitung.
-> MediaCodec (Encoder): An diesem Punkt, ich denke, das ist, wo wir feststellen sollte MediaFormat-Parameter wie video-Auflösung, die uns helfen sollen, reduzieren Sie die endgültige Größe der mp4-Datei.
-> MediaMuxer für generieren mp4-Datei (MinSDK 18, könnte dies ein problem sein, aber für jetzt... ok) .
Ich will nicht von einer SurfaceView/TextureView.
In Bezug auf die audio, ich will nicht, um es zu verarbeiten, um die Qualität.
Habe ich alle Beispiele hier:
http://bigflake.com/mediacodec/
Hab ich auch gesehen CTS-source-code-Module.
Und ich habe schon einige Projekte wie diese:
https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java
Und natürlich habe ich gelesen, Dutzende von posts auf stackoverflow.
Das problem ist, dass ich noch nicht gefunden code-Beispiel, das gut funktioniert, dafür hat. Ich habe versucht, verschiedene Teile des Codes, und legen Sie Sie zusammen an einem Projekt, aber nicht wirklich funktioniert.
Dank.
- bitte teilen, wenn du keine Lösung gefunden für dieses problem.
- Waren Sie jemals in der Lage, dieses problem zu lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die nächste Sache, was, die Sie wollen, ist wahrscheinlich die DecodeEditEncodeTest auf bigflake. Sie brauchen nicht
SurfaceView
oderTextureView
, da Sie nicht versuchen, um die Anzeige der video -, aber Sie brauchen, um eineSurfaceTexture
.Den test-code generiert ein video, dann dekodiert /bearbeitet /encodiert, dann tests der codierten Ausgabe. Sie möchten die decode-Bearbeiten-Kodieren Teil. Bei der Erstellung der encoder, geben Sie, was Größe Sie wollen. Die Eingabe-Oberfläche, die es schafft, werden passend. Die Skalierung wird durchgeführt, indem die GPU zum Rendern der GL eine textur (von der
SurfaceTexture
) auf den encoder-Eingabe-Oberfläche. Sie müssen entscheiden, ob GLES lineare Filterung stellt das Niveau der Qualität, die Sie brauchen.(Sie können etwas ähnliches in ExtractMpegFramesTest, die skaliert alles auf 640x480 wie es ist, das die Extraktion. In diesem Fall ist die Umwandlung der Einzelbilder in PNG anstatt Fütterung in einen encoder, so dass es nicht als zutreffend für Ihre situation zu erhalten.)
Drop frames ist theoretisch ganz einfach: nicht Einreichen, um den encoder. In der Praxis ist es ein bisschen schwieriger, wenn die Eingabe unregelmäßig angeordneten Rahmen. Wenn die Eingabe "frame1 frame2 ... pause ... frame4 frame5", und Sie drop-frame2, am Ende werden Sie angehalten, auf frame1, das könnte seltsam Aussehen. Sie können die Präsentations-Zeitstempel, um herauszufinden, das timing.
Oberfläche input und
MediaMuxer
(erforderlich für das speichern von H. 264 als .mp4) erfordern API 18+. Für ältere Versionen von Android, werden Sie wahrscheinlich wollen, verwenden Sie ein Drittanbieter-Bibliothek wie ffmpeg.