2016-04-23 2 views
2

Ich habe Probleme in meinem aktuellen Projekt, das Videoverarbeitung erfordert. Grundsätzlich sollte die Crop-Funktion (Video sollte quadriert werden), das Trimmen (Video sollte nicht länger als 30 Sekunden dauern) und die Qualitätsreduzierung (Bitrate sollte 713K betragen) sein.
Ich habe erfolgreich FFmpeg in die Anwendung eingebettet, funktionieren alle Funktionen ganz gut, bis auf ein wichtiges Detail - Verarbeitung nach meinem Chef dauert zu lange Zeit. Bei Videos mit einer Größe von 52 MB für 36 Sekunden dauert es 50 Sekunden, um alle Vorgänge auszuführen (ich trenne das Video auf 30 Sekunden vor jeder anderen Operation). Das Problem ist, dass bei einem parallelen Projekt auf iOS die Videoverarbeitung für größere Dateien etwa 10-15 Sekunden dauert. Ich nehme an, dass es damit zusammenhängt, dass sie das Apple QuickTime-Format benutzen, das offensichtlich von Apple entwickelt wurde, also ist es nicht verwunderlich, dass es ziemlich schnell funktioniert.
Also gut, es war die Einführung, jetzt meine Frage: Gibt es eine Möglichkeit für Android, jedes Video in jeder Qualität (für jetzt können wir davon ausgehen, dass alle Videos in h264 sind) in Zeit von 10-15 Sekunden (nicht mehr als in 30 Sekunden, wie mein Chef sagte)? Eine Alternative zu FFmpeg, die Operationen schneller ausführen kann? Ich bin mir ziemlich sicher, dass es keine Möglichkeit gibt, solche Arbeit in so kurzer Zeit zu erledigen, da ich mich bereits beim Internetsuchen Gedanken gemacht habe, aber ich möchte sicherstellen, dass es wirklich keine Möglichkeit gibt, solche Arbeit zu verrichten. Wenn jemand mir Links zur Lösung schneller als FFmpeg zur Verfügung stellen kann oder bestätigen kann, dass es keine solche Lösung gibt, werde ich sehr dankbar sein.Android, schnelle Videoverarbeitung

aktualisieren
Dank Alex Cohn habe ich dies mit MediaCodec gelöst. Nach einer Weile, habe ich 20 Sekunden Verarbeitung auf 52MB Video mit Cropping auf Square und Verringerung der Bitrate. Für alle zukünftigen Googler aus hier kann ich vorschlagen, einen Blick auf diese respository zu nehmen: Many stuff about MediaCodec
und genauer auf diese Datei: Extract, edit and encode again, video and audio

Antwort

3

Wenn das Video auf dem gleichen Gerät aufgezeichnet wurde, haben Sie eine sehr gute Chance, dass MediaCodec und native Android media APIs wird viel schneller sein (sowohl Decoder und Encoder in HW laufen). Andernfalls können Sie versuchen, das Video mit MediaCodec zu dekodieren, und auf FFmpeg Software-Decoder zurückgreifen, wenn es fehlschlägt. Selbst dann, wenn Sie MediaCodec für die Komprimierung verwenden können, kann dies allein eine Leistung bringen, die Ihren Chef zufriedenstellt.

Es gibt ein (veraltetes) Projekt namens libstagefright, das FFmpeg mit Unterstützung für den Hardware-Codec erstellt, und es wurde entwickelt, um mit API 10+ zu arbeiten.

Vergessen Sie nicht, die CPU-Eigenschaften Ihres Android-Geräts und der iOS-Plattform zu vergleichen (wenn das ein 6S ist, haben sie eine wichtige Bedeutung). Berücksichtigen Sie Multithread-Codierung und Decodierung.

BTW: Beachten Sie, dass FFmpeg nicht mit H264 Encoder kommt, und das typische Bündel von FFmpeg + x264 ist GPL, und verlangt, dass alle Ihre App sourced offen zu sein (oder eine saftige Lizenzgebühr für x264 bezahlen, aber immer noch gezwungen sein, die LGPL von FFmpeg zu erfüllen).

Beachten Sie, dass Sie ein quadratisches Video machen können, indem Sie nur die MP4-Header manipulieren, ohne Transcodierung!

+0

Hm, ich habe schon versucht, HW auf FFmpeg zu verwenden, aber es ist fehlgeschlagen. Ich habe natürlich auch die Dokumentation von MediaCodec gelesen, aber ich habe nicht verstanden, wie man das schön integriert. Und es gibt ein Problem, da die minimale API-Version für unser Projekt 15 ist und MediaCodec 16, aber ich denke, dass ich das Team dazu überreden kann, die minimale API auf 16 zu setzen, wenn es notwendig sein sollte. Wie auch immer, ich werde mir MediaCodec genauer ansehen und hoffentlich eine Lösung damit finden :) Was ist mit h264, ja, wir benutzen libx264 und ich habe meinen Chef über Lizenzprobleme informiert.Er sagte, ich solle mich nicht darum kümmern, und überließ es ihm, wie ich genau tat –

+0

HW Unterstützung von FFmpeg bedeutet SIMD Beschleunigung, d. H. Moderate inkrementelle Verbesserung. MediaCodec verwendet den HW-Encoder, der im Wesentlichen durch den Speicherbus begrenzt ist. –

+0

API 15 ist eine seltsame Einschränkung, mit 2,2% Geräten heute und nie eine beliebte Plattform. Entweder bei Lebkuchen bleiben oder zu Jellybean oder höher wechseln. –