相关疑难解决方法(0)

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

在我的应用程序中,我正在尝试上传用户从图库中选择的一些视频.问题是通常android视频文件太大而无法上传,因此我们希望首先通过较低的比特率/分辨率来压缩它们.

我刚刚听说过使用API​​ 16引入的新MediaCodec api(我以前试图用ffmpeg这样做).

我现在正在做的是:首先使用视频解码器解码输入视频,并使用从输入文件中读取的格式对其进行配置.接下来,我创建了一个带有一些预定义参数的标准视频编码器,并用它来编码解码器输出缓冲区.然后我将编码器输出缓冲区保存到文件中.

一切看起来都很好 - 从每个输入和输出缓冲区写入和读取相同数量的数据包,但最终文件看起来不像视频文件,任何视频播放器都无法打开.

看起来解码没问题,因为我通过在Surface上显示它来测试它.我首先配置解码器以使用Surface,当我们调用releaseOutputBuffer时,我们使用render标志,我们可以在屏幕上看到视频.

这是我正在使用的代码:

    //init decoder
    MediaCodec decoder = MediaCodec.createDecoderByType(mime);
    decoder.configure(format, null , null , 0);
    decoder.start();
    ByteBuffer[] codecInputBuffers = decoder.getInputBuffers();
    ByteBuffer[] codecOutputBuffers = decoder.getOutputBuffers();

    //init encoder
    MediaCodec encoder = MediaCodec.createEncoderByType(mime);
    int width = format.getInteger(MediaFormat.KEY_WIDTH);
    int height = format.getInteger(MediaFormat.KEY_HEIGHT);
    MediaFormat mediaFormat = MediaFormat.createVideoFormat(mime, width, height);
    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();
    ByteBuffer[] encoderInputBuffers = encoder.getInputBuffers();
    ByteBuffer[] encoderOutputBuffers = encoder.getOutputBuffers();

    extractor.selectTrack(0);

    boolean sawInputEOS = false; …
Run Code Online (Sandbox Code Playgroud)

compression video android

22
推荐指数
1
解决办法
3万
查看次数

Android MediaCodec:减少mp4视频大小

我正在寻找一种"压缩"mp4视频的方法.为此,我想降低视频的分辨率和/或降低FPS.

经过长时间的研究,我认为这样做的方法是使用MediaCodec和相关的API,如下所示:

- > MediaExtractor从mp4文件中提取编码的媒体数据. - > MediaCodec(解码器):解码每个帧以供以后处理. - > MediaCodec(编码器):此时,我猜我们应该在哪里建立MediaFormat参数,例如视频分辨率,这应该有助于我们减少mp4文件的最终大小. - > MediaMuxer用于生成mp4文件(MinSDK 18,这可能是一个问题,但现在......好吧).

我不想使用SurfaceView/TextureView.关于音频,我不想处理它以降低质量.

我一直在看这里的所有例子:http: //bigflake.com/mediacodec/

我也看过CTS源代码模块.

我一直在研究以下几个项目:https: //github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java

当然,我已经在stackoverflow上阅读了几十篇帖子.

问题是我还没有找到任何适合这个porpuse的代码示例.我尝试将各种代码片段放在一起放在一个项目中,但实际上并没有用.

谢谢.

video mp4 android resolution mediacodec

13
推荐指数
1
解决办法
1万
查看次数

像Whatsapp这样的快速视频压缩

我需要在我的Android应用中加快视频压缩速度.我正在使用FFMPEG,压缩80MB视频需要3分钟.有谁知道更好的解决方案?

我正在使用的命令是:

/data/data/com.moymer/app_bin/ffmpeg -y -i /storage/emulated/0/DCIM/Camera/VID_20150803_164811363.mp4 -s 640x352 -r 25 -vcodec mpeg4 -ac 1 -preset ultrafast -strict -2 /storage/emulated/0/DCIM/Camera/compressed_video.mp4
Run Code Online (Sandbox Code Playgroud)

我从这个github repo使用FFMPEG for Android运行此命令:https://github.com/guardianproject/android-ffmpeg-java

在我的项目中使用FFMPEG的代码在AsyncTask中,并在下面复制:

@Override
protected Object doInBackground(Object... params) {

    ItemRoloDeCamera compressedVideo = new ItemRoloDeCamera();

    File videoInputFile = new File(video.getSdcardPath());

    File videoFolderFile = videoInputFile.getParentFile();

    File videoOutputFile = new File(videoFolderFile, "video_comprimido_moymer.mp4");

    if (videoFolderFile.exists())
        android.util.Log.e("COMPRESS VIDEO UTILS", "video folder exist");
    else
        android.util.Log.e("COMPRESS VIDEO UTILS", "video folder DON'T exist");

    if (videoInputFile.exists())
        android.util.Log.e("COMPRESS VIDEO UTILS", "video input file exist");
    else
        android.util.Log.e("COMPRESS …
Run Code Online (Sandbox Code Playgroud)

compression video android ffmpeg

6
推荐指数
0
解决办法
4905
查看次数

标签 统计

android ×3

video ×3

compression ×2

ffmpeg ×1

mediacodec ×1

mp4 ×1

resolution ×1