或者,通过调用setInputSurface(Surface)设置编解码器以使用先前创建的持久输入surface(persistent input surface)。 编解码器特定数据(Code-specific Data,简写为csd) 某些格式,尤其 AAC音频 和 MPEG4, H.264以及H.265视频格式 要求 实际数据 以包含设置数据或编解码器特定数据的多个缓冲区 来做前缀(为辅助理解,附上...
// csd-0、csd-1、csd-2同理 val bytes = byteArrayOf(0x00.toByte(), 0x01.toByte()) mediaFormat.setByteBuffer("csd-0", ByteBuffer.wrap(bytes)) 其中csd-0、csd-1 这些键可以从 MediaExtractor#getTrackFormat 获取的MediaFormat中获取,这些特定的数据会在start 时自动提交给 MediaCodec,无需直接提...
ExtractMpegFramesTest.java(requires 4.2, API 17) 提取一个.mp4视频文件的开始10帧,并保持成一个PNG文件到sd卡中,使用MediaExtractor提取 CSD 数据,并将单个 access units给MediaCodec解码器,帧被解码到一个SurfaceTexture的surface中,离屏渲染,并通过 glReadPixels() 拿到数据后使用 Bitmap#compress() 保存成一个P...
csd 意为 c odec specific data。 调用configure 将设置了 csd 的 MediaFormat 传递给 MediaCodec。 "csd-0"、"csd-1" 等键值对应的信息始终包含在使用 MediaExtractor 解析获得的 MediaFormat 的轨道(media track)中。csd 在 MediaCodec.start() 方法被调用时会自动提交给 codec;我们不能手动提交此数据。 如果...
private static final String CSD0 = "csd-0"; private static final String CSD1 = "csd-1"; private static final int TIME_INTERNAL = 1; private static final int DECODER_TIME_INTERNAL = 1; private MediaCodec mCodec; private long mCount = 0; // 媒体解码器MediaCodec用的 ...
其中csd-0、csd-1 这些键可以从 MediaExtractor#getTrackFormat 获取的MediaFormat中获取,这些特定的数据会在start 时自动提交给 MediaCodec,无需直接提交此数据,如果在输出缓冲区或格式更改之前调用了 flush,则会丢失提交的特定数据,就需要在 queueInputBuffer 的调用中使用标志 BUFFER_FLAG_CODEC_CONFIG 标记这类数据...
mediaFormat.setByteBuffer("csd-0", extradata); // ... mediaCodec.configure(mediaFormat, surface, 0, 0); // ... 对于mp4/flv/mkv等封装,我们得到的是AVCC格式的extradata,需要先将该extradata转换为Annex-B格式的两个NALU, 然后用startcode进行分割。
編解碼器特定數據也可以包含在 ByteBuffer 專案中傳遞的格式#configure configure,其中包含索引鍵 「csd-0」、“csd-1 等。這些索引鍵一律包含在從 取得的MediaExtractor#getTrackFormat MediaExtractor追蹤MediaFormat中。 格式的編解碼器特定數據會自動提交至編解碼器;#start您強式>「不可<」/「強」>明確<提交此數...
如果你直接把编码器输出传递给解码器,就会发现第一个包里面有BUFFER_FLAG_CODEC_CONFIG 的flag,这个参数需要确保传递给了解码器,这样解码器才会开始接收数据,或者你可以直接设置CSD数据给MediaFormat,通过configure()方法设置给解码器,这里可以参考EncodeDecodeTest sample这个例子。
解码器类型(mime),视频宽度(width),视频高度(height),最大数据输入大小(max_input_size),csd-0,csd-1。 mediaFormat=MediaFormat.createVideoFormat(mime,width,height);mediaFormat.setInteger(MediaFormat.KEY_WIDTH,width);mediaFormat.setInteger(MediaFormat.KEY_HEIGHT,height);mediaFormat.setLong(MediaFormat.KE...