相关疑难解决方法(0)

在Android上解码h264 ByteStream

我想在Android中解码并显示原始的h264视频字节流,因此我目前正在使用这些MediaCodec/Format类.我从服务器通过Udp获取帧数据.但是,遗憾的是,目前没有显示任何内容.

这是我到目前为止所拥有的.

初始化MediaCodec类:

codec = MediaCodec.createDecoderByType("video/avc");

MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "video/avc");
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 100000);
format.setInteger(MediaFormat.KEY_WIDTH, 800);
format.setInteger(MediaFormat.KEY_HEIGHT, 600);
format.setInteger("max-width", 800);
format.setInteger("max-height", 600);
format.setInteger("push-blank-buffers-on-shutdown", 1);

codec.configure(format, surface, null, 0);
Run Code Online (Sandbox Code Playgroud)

解码器的用法:

int inIndex = codec.dequeueInputBuffer(10000);
if(inIndex >= 0)
{
                ByteBuffer inputBuffer = codecInputBuffers[inIndex];
                inputBuffer.clear();
                inputBuffer.put(frameData);
                codec.queueInputBuffer(inIndex, 0, frameSize, 33, 0);
}

int outIndex = codec.dequeueOutputBuffer(null, 10000);

switch(outIndex)
{
  case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
    codecOutputBuffers = codec.getOutputBuffers();
    System.out.println("OB Changed");
    break;
  case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
        System.out.println("OF Changed");
        break;
  case MediaCodec.INFO_TRY_AGAIN_LATER:
    System.out.println("l8r");
    break;
  default:
    ByteBuffer buffer = …
Run Code Online (Sandbox Code Playgroud)

java video android decode mediacodec

8
推荐指数
1
解决办法
7871
查看次数

缓冲表面输入到MediaCodec

已经演示了如何使用像SurfacePreview这样的Surface输入提供MediaCodec,但是在提交之前是否有实用的方法来缓冲此输入MediaCodec

在我的实验中,Galaxy Nexus在使用CameraToMpegTest.java中的直接同步编码方法生成音频/视频流时遇到了令人无法接受的打嗝

当使用MediaCodecbyte[]ByteBuffer输入,我们可以提交未编码数据的ExecutorService或类似的队列进行处理,以确保帧不丢失,即使在CPU使用该设备的经验尖峰我们的应用程序的控制.但是,由于要求在Android的Camera和MediaCodec之间执行颜色格式转换,这种方法对于高分辨率的直播视频来说是不现实的.

想法:

  1. 有没有办法喂NativePixmapType以创建EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p)MediaCodec

  2. 任何来自Android的人都可以评论相机和MediaCodec之间是否协调ByteBuffer格式是否在路线图上?

android mediacodec

7
推荐指数
1
解决办法
4798
查看次数

如何从 MP4 中逐帧获取?(媒体编解码器)

实际上我正在使用 OpenGL,我想将我所有的纹理都放在 MP4 中以压缩它们。

然后我需要从我的 Android 上的 MP4 中获取它

我需要以某种方式解码 MP4 并根据请求逐帧获取。

我找到了这个 MediaCodec

https://developer.android.com/reference/android/media/MediaCodec

和这个 MediaMetadataRetriever

https://developer.android.com/reference/android/media/MediaMetadataRetriever

但是我没有看到如何逐帧请求的方法......

如果有人用过MP4,请给我一个去哪里的方法。

PS我正在使用本机方式(JNI),所以怎么做都无所谓..Java或本机,但我需要找到方法。

编辑1

我制作了某种电影(只有一个 3d 模型),所以我每 32 毫秒更改一次几何和纹理。因此,在我看来,将 mp4 用于 tex 似乎是合理的,因为每个新帧(32 毫秒)都与原始帧非常相似......

现在我为一个模型使用 400 帧。对于几何,我使用 .mtr,对于 tex,我使用 .pkm(因为它针对 android 进行了优化),所以我有大约 350 个 .mtr 文件(因为有些文件包含子索引)和 400 个 .pkm 文件......

这就是为什么我要为 tex 使用 mp4 的原因。因为一个 mp4 比 400 .pkm 小得多

编辑2

请看一下 Edit1

实际上,我需要知道的只是可以MP4按帧读取的Android API ?也许某种getNextFrame()方法?

像这样的东西

MP4Player player = new MP4Player(PATH_TO_MY_MP4_FILE);

void readMP4(){
   Bitmap b;

   while(player.hasNext()){ …
Run Code Online (Sandbox Code Playgroud)

mp4 android opengl-es android-mediacodec

4
推荐指数
1
解决办法
6293
查看次数

标签 统计

android ×3

mediacodec ×2

android-mediacodec ×1

decode ×1

java ×1

mp4 ×1

opengl-es ×1

video ×1