在我的应用程序中,我正在尝试上传用户从图库中选择的一些视频.问题是通常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) 我正在寻找一种"压缩"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的代码示例.我尝试将各种代码片段放在一起放在一个项目中,但实际上并没有用.
谢谢.
我需要在我的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)