This indicated that the buffer marked as such contains codec initialization / codec specific data instead of media data.
取出MediaCodec.BufferInfo 内的数据之后,根据不同的标识符进行不同的操作: BUFFER_FLAG_CODEC_CONFIG 表示当前数据是一些配置数据,在 H264 编码中就是 SPS 和 PPS 数据,也就是 00 00 00 01 67 和 00 00 00 01 68 开头的数据,这个数据是必须要有的,它里面有着视频的宽、高信息。 BUFFER_FLAG_KEY_FRAME...
int flags:一个由BUFFER_FLAG_CODEC_CONFIG和BUFFER_FLAG_END_OF_STREAM标志组成的位掩码。虽然没有被禁止,但是大多数codec并不对输入buffer使用BUFFER_FLAG_KEY_FRAME标志。 BUFFER_FLAG_END_OF_STREAM:用于指示这是输入数据的最后一部分。 BUFFER_FLAG_CODEC_CONFIG:通过指定这个标志,可以在start()或flush()之后直...
在这种刷新时,要确保合适的codec操作不出问题,必须要重提交data,使用带BUFFER_FLAG_CODEC_CONFIG标志的buffers。 在任意有效的output buffers输出的buffer带有codec-config 标志前,编码器(或codec生成压缩数据)将创建并返回编码特定的数据。buffer包含codec-specific-data没有意义的时间戳。 Codec数据处理过程 每个codec维护...
int offset:数据开始时输入buffer中的字节偏移量。 int size:有效输入数据的字节数。 long presentationTimeUs:此buffer的PTS(以微秒为单位)。 int flags:一个由BUFFER_FLAG_CODEC_CONFIG和BUFFER_FLAG_END_OF_STREAM标志组成的位掩码。虽然没有被禁止,但是大多数codec并不对输入buffer使用BUFFER_FLAG_KEY_FRAME标志...
codec.queueInputBuffer(inputBufferId, …); } // 从输出缓冲区队列中拿到编解码后的内容,进行相应操作后释放,供下一次使用 int outputBufferId = codec.dequeueOutputBuffer(…); if (outputBufferId >= 0) { ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId); ...
int audioSize = record.read(bufferCache, bufferCache.remaining()); if(audioSize != AudioRecord.ERROR_INVALID_OPERATION && audioSize != AudioRecord.ERROR_BAD_VALUE) { int flag = endOfStream?4:0; // 通知编码器编码 this.mEncoder.queueInputBuffer(e, 0, audioSize, this.mLastPresentationTimeUs...
当包含音频数据时,压缩缓冲区中通常包含 n(n >= 1) 个编码过的音频帧。无论压缩缓冲区中包含几个编码过的音频帧,缓冲区的数据都是在帧的边界开始或结束;如果想要在任意字节开始或结束,需要给 MediaCodec 设置 BUFFER_FLAG_PARTIAL_FRAME 标记。 注意音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用...
createByCodecName:知道组件的确切名称(如OMX.google.mp3.decoder)的时候,根据组件名创建codec。使用MediaCodecList可以获取组件的名称。 2.configure:配置解码器或者编码器。 3.start:成功配置组件后调用start。 4.buffer处理的接口: dequeueInputBuffer:从输入流队列中取数据进行编码操作。