Komprimieren von Videos mit android MediaCodec api
Will ich komprimieren lokal gespeicherte video-Datei auf eine kleinere Größe, um auf einen server hochladen.
Da ich MediaCodec , ich habe einige Tipps zum komprimieren von Videos . Hier sind die Schritte, die ich gefolgt
1) . Extrahiert die media-Datei mit MediaExrtactor und Decodiert es.
2) . Schafft der Encoder mit der gewünschten Datei-format
3) . Erstellen muxer zum speichern der Datei in dem lokalen Speicher. (nicht vollständig)
Frage : Aber ich weiß nicht, wie zu Kodieren, die bereits dekodierten stream und speichern den Strom in die lokalen Speicher verwenden MediaMuxer.
public class CompressMedia {
private static final String SAMPLE = Environment
.getExternalStorageDirectory() + "/DCIM/Camera/20140506_174959.mp4";
private static final String OUTPUT_PATH = Environment
.getExternalStorageDirectory()
+ "/DCIM/Camera/20140506_174959_REC.mp4";
private MediaExtractor extractor;
private MediaCodec decoder;
private MediaCodec encoder;
String mime;
private static final String MIME_TYPE = "video/avc";
public void extractMediaFile() {
//work plan
//locate media file
//extract media file using Media Extractor
//retrieve decoded frames
extractor = new MediaExtractor();
try {
extractor.setDataSource(SAMPLE);
} catch (IOException e) {
//TODO Auto-generated catch block
//file not found
e.printStackTrace();
}
//add decoded frames
for (int i = 0; i < extractor.getTrackCount(); i++) {
MediaFormat format = extractor.getTrackFormat(i);
mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/")) {
extractor.selectTrack(i);
decoder = MediaCodec.createDecoderByType(mime);
decoder.configure(format, null, null, 0);
break;
}
}
if (decoder == null) {
Log.e("DecodeActivity", "Can't find video info!");
return;
}
//- start decoder -
decoder.start();
extractor.selectTrack(0);
//- decoded frames can obtain in here -
}
private void createsEncoder() {
//creates media encoder to set formats
encoder = MediaCodec.createDecoderByType(MIME_TYPE);
//init media format
MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, /* 640 */
320, /* 480 */240);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 400000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 25);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
encoder.configure(mediaFormat, null, null,
MediaCodec.CONFIGURE_FLAG_ENCODE);
encoder.start();
//- encoded data format is avaiable in here
}
private void createMuxer() {
//creates media muxer - media muxer will be used to write the final
//strem in to a desired file :)
try {
MediaMuxer muxer = new MediaMuxer(OUTPUT_PATH,
OutputFormat.MUXER_OUTPUT_MPEG_4);
int videoTrackIndex = muxer.addTrack(encoder.getOutputFormat());
//muxer.writeSampleData(videoTrackIndex, inputBuffers, bufferInfo);
muxer.start();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Hier sind die links, die ich follwed
Android MediaCodec: Reduzieren Sie den mp4-video-Größe und
Video Kompression auf android mit neuen MediaCodec Bibliothek
ich verwendete intel-transcode-pack zur Kompression, arbeitete er von kit-kat , habe nicht versucht, von mediacodec , ich denke, der einfachste Weg, es zu tun , mit ffmepg , u bekomme ffmpeg-Support auf android-studio unter Einsatz von vorkompilierten libs FFPEG
Danke für die Antwort..
InformationsquelleAutor Mr.G | 2014-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, Intel INDE auf https://software.intel.com/en-us/intel-inde und Media-Pack für Android, das ist ein Teil der INDE, tutorials,https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials. Es ist ein Beispiel, das zeigt, wie media-pack transcode=komprimieren Sie video-Dateien. Sie können kleinere Auflösung und /oder bitrate der Ausgabe erhalten Sie kleinere Dateien
in ComposerTranscodeCoreActivity.java
InformationsquelleAutor Marlon