相关疑难解决方法(0)

将位图数组转换为YUV(YCbCr NV21)

如何将返回的Bitmap转换BitmapFactory.decodeFile()为YUV格式(simillar到相机的onPreviewFrame()返回字节数组)?

android image-processing yuv android-image android-camera

27
推荐指数
2
解决办法
4万
查看次数

如何使用MediaCodec将位图编码为视频?

我想将一组位图编码到h264中.这可以通过MediaEncoder吗?我已经编写了一些代码来执行此操作,但输出无法在我尝试过的任何媒体播放器中播放.这里是我主要从Stackoverflow上找到的其他来源借用的一些代码.

mMediaCodec = MediaCodec.createEncoderByType("video/avc");
mMediaFormat = MediaFormat.createVideoFormat("video/avc", 320, 240);
mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
mMediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mMediaCodec.configure(mMediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mMediaCodec.start();
mInputBuffers = mMediaCodec.getInputBuffers();

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); // image is the bitmap
byte[] input = byteArrayOutputStream.toByteArray();

int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
    ByteBuffer inputBuffer = mInputBuffers[inputBufferIndex];
    inputBuffer.clear();
    inputBuffer.put(input);
    mMediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

我应该调整什么?

android bitmap video-encoding h.264 android-4.2-jelly-bean

25
推荐指数
4
解决办法
2万
查看次数

使用MediaCodec将一系列图像保存为视频

我正在尝试将MediaCodec一系列图像(保存为文件中的字节数组)保存到视频文件中.我已经测试了这些图像SurfaceView(在系列中播放),我可以看到它们很好.我看了很多使用的例子MediaCodec,这是我理解的(如果我错了请纠正我):

从MediaCodec对象获取InputBuffers - >用你的帧的图像数据填充它 - >将输入缓冲区排队 - >获取编码输出缓冲区 - >将其写入文件 - >增加显示时间并重复

但是,我已经对此进行了很多测试,最终我遇到了两种情况之一:

  • 我试图模仿的所有示例项目都queueInputBuffer在第二次调用时导致Media服务器死机.
  • 我尝试codec.flush()在最后调用(在将输出缓冲区保存到文件之后,虽然我看到的所有示例都没有这样做)并且媒体服务器没有死,但是,我无法使用任何媒体播放器打开输出视频文件,所以出了点问题.

这是我的代码:

MediaCodec codec = MediaCodec.createEncoderByType(MIMETYPE);
        MediaFormat mediaFormat = null;
        if(CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)){
            mediaFormat = MediaFormat.createVideoFormat(MIMETYPE, 1280 , 720);
        } else {
            mediaFormat = MediaFormat.createVideoFormat(MIMETYPE, 720, 480);
        }


        mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 700000);
        mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 10);
        mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
        mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
        codec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

        codec.start();

        ByteBuffer[] inputBuffers = codec.getInputBuffers();
        ByteBuffer[] outputBuffers = codec.getOutputBuffers();
        boolean sawInputEOS = false;
        int inputBufferIndex=-1,outputBufferIndex=-1;
        BufferInfo info=null;

                    //loop …
Run Code Online (Sandbox Code Playgroud)

video android mediacodec

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

Android编码器复用器:原始h264到mp4容器

我创建了一个h264原始视频文件,我能够在Android 4.3及更高版本上与Android MediaMuxer进行复用.现在我需要支持Android版本4.1和4.2.我找到了Jcodec.这样做有一个例子:

https://github.com/jcodec/jcodec/blob/master/samples/main/java/org/jcodec/samples/mux/AVCMP4Mux.java

但是我在第70行得到了java.nio.ReadOnlyBufferException异常:

H264Utils.encodeMOVPacket(数据);

我想这段代码不适用于Android?我该如何解决.熟悉Jcodec的人可以帮忙解决这个问题吗?

android codec h.264 muxer jcodec

6
推荐指数
1
解决办法
7832
查看次数