2014-02-27 21 views
11

Ich bin auf der Suche nach einer Möglichkeit, ein mp4 Video zu "komprimieren". Um dies zu erreichen, möchte ich die Auflösung des Videos reduzieren und/oder FPS reduzieren.Android MediaCodec: Reduzieren mp4 Videogröße

Nach langer Forschung, denke ich, die Art und Weise, es zu tun ist MediaCodec und verwandte APIs wie folgt zu verwenden:

-> MediaExtractor codierte Mediendaten aus einer MP4-Datei zu extrahieren. -> MediaCodec (Decoder): Decodieren Sie jeden Frame für die spätere Verarbeitung. -> MediaCodec (Encoder): An dieser Stelle, denke ich, sollten wir hier MediaFormat-Parameter wie Videoauflösung einrichten, die uns helfen sollten, die endgültige Größe der mp4-Datei zu reduzieren. -> MediaMuxer für MP4-Datei generieren (MinSDK 18, dies könnte ein Problem sein, aber für jetzt ... ok).

Ich möchte kein SurfaceView/TextureView verwenden. In Bezug auf das Audio möchte ich es nicht verarbeiten, um die Qualität zu reduzieren.

Ich habe mich bei allen Beispielen hier: http://bigflake.com/mediacodec/

Ich habe auch CTS Quellcodemodule gesehen.

Und ich habe an mehreren Projekten wie diese suchen: https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java

Und natürlich habe ich Dutzende von Stellen auf Stackoverflow lesen.

Das Problem ist, dass ich noch kein Code-Beispiel gefunden habe, das gut für dieses porpuse funktioniert. Ich habe versucht, verschiedene Code-Stücke zu nehmen und sie zu einem Projekt zusammenzufügen, funktioniert aber nicht wirklich.

Danke.

+3

teilen Sie bitte, wenn Sie irgendeine Lösung dieses Problems gefunden haben. – Kanchan

+0

Konnten Sie dieses Problem jemals lösen? –

Antwort

4

Das nächste, was Sie wollen, ist wahrscheinlich die DecodeEditEncodeTest auf bigflake. Sie brauchen SurfaceView oder TextureView nicht, da Sie nicht versuchen, das Video anzuzeigen, aber Sie müssen ein SurfaceTexture verwenden.

Der Testcode generiert ein Video, dekodiert/bearbeitet/kodiert und testet die codierte Ausgabe. Sie möchten den Decoder-Edit-Encode-Part. Wenn Sie den Encoder erstellen, geben Sie ihm die gewünschte Größe. Die Eingabefläche, die erstellt wird, wird entsprechend angepasst. Die Skalierung wird von der GPU ausgeführt, da sie die GL-Textur (von SurfaceTexture) auf die Eingabeoberfläche des Codierers rendert. Sie müssen entscheiden, ob die lineare GLES-Filterung das von Ihnen benötigte Qualitätsniveau bietet.

(Sie können etwas Ähnliches in ExtractMpegFramesTest sehen, das alles auf 640x480 skaliert, da es die Extraktion macht. In diesem Fall konvertiert es die Frames in PNG, anstatt sie in einen Encoder einzufügen, also ist es für Ihre Situation nicht zutreffend.)

Dropping Frames ist theoretisch einfach: nur nicht an den Encoder übergeben. In der Praxis ist es etwas schwieriger, wenn die Eingabe unregelmäßig beabstandete Frames hat. Wenn die Eingabe "frame1 frame2 ... pause ... frame4 frame5" ist und Sie frame2 löschen, werden Sie in Frame1 pausiert, was seltsam aussehen könnte. Sie können die Präsentationszeitstempel verwenden, um das Timing herauszufinden.

Oberflächeneingabe und MediaMuxer (erforderlich zum Speichern von H.264 als .mp4) erfordern API 18+. Für ältere Android-Versionen möchten Sie wahrscheinlich eine Bibliothek eines Drittanbieters wie ffmpeg verwenden.

+0

DecodeEditEncodeTest dekodiert nur das Video, aber wie man es kodiert. Grundsätzlich möchte ich die Videogröße reduzieren, um sie auf dem Server zu senden. – Kanchan

+0

irgendein Vorschlag. – Kanchan

+0

Es heißt "DecodeEditEncodeTest", weil es das Video decodiert und dann codiert, indem es die Farben modifiziert (bearbeitet). – fadden