我尝试使用以下转换循环执行。
while (true) {
sampleSize = extractor.readSampleData(inputBuffer, 0)
if (sampleSize < 0) break
val presentationTimeUs = extractor.sampleTime
val flags = extractor.sampleFlags
val inputBufferId = codec.dequeueInputBuffer(codecTimeoutUs)
if (inputBufferId >= 0) {
val codecBuffer = codec.getInputBuffer(inputBufferId)
codecBuffer?.put(inputBuffer)
codec.queueInputBuffer(inputBufferId, 0, sampleSize, presentationTimeUs, flags)
}
extractor.advance()
val outputBufferId = codec.dequeueOutputBuffer(bufferInfo, codecTimeoutUs)
if (outputBufferId >= 0) {
val codecBuffer = codec.getOutputBuffer(outputBufferId)
muxer.writeSampleData(outputTrackIndex, codecBuffer!!, bufferInfo)
codec.releaseOutputBuffer(outputBufferId, false)
}
}
结果是一个无效的.3gp 文件,你能帮我吗?
代码片段没有显示
MediaExtractor
、MediaCodec
和MediaMuxer
是如何配置的,所以图片不完整。
一般情况下,辅助
inputBuffer
必须在写入前清零,在读取前翻转。
但是让编解码器管理缓冲区更容易:
val inputBuffer = codec.getInputBuffer(inputBufferId)!!
val sampleSize = extractor.readSampleData(inputBuffer, 0)
此外,如果
sampleSize
为负数,则应将其视为文件结尾并通知编解码器:
codec.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM)