当前位置: 首页 > 知识库问答 >
问题:

使用android MediaCodec api压缩视频

黄景胜
2023-03-14

我想将本地保存的视频文件压缩到更小的大小,以便上传到服务器。

自从我使用MediaCodec以来,我发现了一些压缩视频的技巧。以下是我遵循的步骤

1) . 使用MediaExrtactor提取媒体文件并对其进行解码。2) . 使用所需的文件格式创建编码器(3)。创建muxer以将文件保存在本地存储中。(不完整)

问题:但我不知道如何对已经解码的流进行编码,并使用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();
        }

    }

}

以下是我跟随Android MediaCodec的链接:减小mp4视频大小和

使用新的MediaCodec库在android上进行视频压缩

共有1个答案

夏知
2023-03-14

你可以试试英特尔INDEhttps://software.intel.com/en-us/intel-indeAndroid媒体包是INDE的一部分,关于https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials.它有一个示例,演示了如何使用media pack转码=重新压缩视频文件。您可以将较小的分辨率和\或比特率设置为输出,以获得较小的文件

在代码转换活动中。JAVA

protected void setTranscodeParameters(MediaComposer mediaComposer) throws IOException {

    mediaComposer.addSourceFile(mediaUri1);
    mediaComposer.setTargetFile(dstMediaPath);

    configureVideoEncoder(mediaComposer, videoWidthOut, videoHeightOut);
    configureAudioEncoder(mediaComposer);
}

protected void transcode() throws Exception {

    factory = new AndroidMediaObjectFactory(getApplicationContext());
    mediaComposer = new MediaComposer(factory, progressListener);
    setTranscodeParameters(mediaComposer);
    mediaComposer.start();
}
 类似资料:
  • 我试着按照ffmpeg4android库,我得到了压缩视频时的问题,如下面的日志图像。 我使用意图转移到压缩媒体类, 03-13 14:49:45.770:I/FFMPEG4Android(6065):WorkingFolderPath://sdcard/videokit/ 03-13 14:49:45.775:d/ffmpeg4android(6065):工作目录存在,不存在(许可证文件和演示视

  • 我正在建立一个应用程序,我需要压缩视频之前,上传到服务器。未经压缩的视频约为五分钟,60M,Android视频位2x1024x1024,640*480。现在我正在使用FFMPEG库压缩视频http://androidwarzone.blogspot.co.il/2011/12/ffmpeg4android.html。以下是command commandStr=“ffmpeg-y-i”+url+“-

  • 在我的Android应用程序中,我想通过改变mp4视频的分辨率、比特率来压缩mp4视频。我不想使用FFmpeg(因为我不想使用NDK),所以我决定使用MediaCodec API。 以下是我的逻辑步骤: null 我的问题是:我不知道如何设置解码器的输出和编码器的输入之间的连接。我可以将视频解码到一个表面,或者从一个表面编码一个新的视频。但我不明白怎么把它们联系起来。 我阅读了以下链接:Andro

  • 我正在编写一个Swift应用程序,通过网络发送iPhone摄像头的视频输入(帧),这样我以后就可以在macOS应用程序上显示它们了。

  • 我正在尝试使用ffmpeg和使用以下命令压缩一个视频。 然而,生成的视频的大小大于原始视频的大小。有没有人可以指出为什么会发生这种情况,如果有其他命令我应该使用。

  • 我有一个学校作业,要求我接受一个输入流,并使用apache commons压缩库将其压缩成一个字节数组,格式有5种(根据用户规范)。这5种格式是:ZIP、JAR、SEVENZ、BZIP2和gzip。我编写了以下方法以JAR格式压缩输入流,但得到了一个带有字符串“no current entry”的illegalStateException。