我想在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) 已经演示了如何使用像SurfacePreview这样的Surface输入来提供MediaCodec,但是在提交之前是否有实用的方法来缓冲此输入MediaCodec?
在我的实验中,Galaxy Nexus在使用CameraToMpegTest.java中的直接同步编码方法生成音频/视频流时遇到了令人无法接受的打嗝
当使用MediaCodec有byte[]或ByteBuffer输入,我们可以提交未编码数据的ExecutorService或类似的队列进行处理,以确保帧不丢失,即使在CPU使用该设备的经验尖峰我们的应用程序的控制.但是,由于要求在Android的Camera和MediaCodec之间执行颜色格式转换,这种方法对于高分辨率的直播视频来说是不现实的.
想法:
有没有办法喂NativePixmapType以创建EGL14.eglCopyBuffers(EGLDisplay d, EGLSurface s, NativePixmapType p)来MediaCodec?
任何来自Android的人都可以评论相机和MediaCodec之间是否协调ByteBuffer格式是否在路线图上?
实际上我正在使用 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)