gpt4 book ai didi

android - MediaMuxer.nativeWriteSampleData 在视频录制期间总是周期性地阻塞大约一秒钟

转载 作者:行者123 更新时间:2023-11-29 00:12:24 31 4
gpt4 key购买 nike

我正在使用 mediacodec + mediamuxer 进行 android 视频录制,现在我可以录制视频并生成可以播放的 mp4 文件。问题是我发现录制的视频有时会占用大约一秒钟。所以我启动了 traceview,我发现 MediaMuxer.nativeWriteSampleData() 导致了问题。有时这个函数很快,在几微秒内返回,但有时这个函数很慢,会消耗大约一秒左右,此时视频会阻塞。我不知道为什么这个功能会不时执行如此不同。录制目标文件位于外置SDCard或内部存储,两种介质均存在问题。

最佳答案

这个问题主要发生在写入闪存速度较低的设备上,或者如果您尝试写入 SD 卡。解决方案是将编码数据复制到临时 ByteBuffer,将数据释放回 MediaCodec 并在专用线程上异步调用 writeSampleData。

因此,假设您有一个用于排出 MediaCodec 输出的线程和一个用于馈送 MediaMuxer 的线程,这是一个可能的解决方案:

// this runs on the MediaCodec's draining thread
public void writeSampleData(final MediaCodec mediaCodec, final int trackIndex, final int bufferIndex, final ByteBuffer encodedData, final MediaCodec.BufferInfo bufferInfo) {
final ByteBuffer data = ByteBuffer.allocateDirect(bufferInfo.size); // allocate a temp ByteBuffer
data.put(encodedData); // copy the data over
mediaCodec.releaseOutputBuffer(bufferIndex, false); // return the packet to MediaCodec

mWriterHandler.post(new Runnable() {
// this runs on the Muxer's writing thread
@Override
public void run() {
mMuxer.writeSampleData(trackIndex, data, bufferInfo); // feed the packet to MediaMuxer
});
}

这种方法的问题是我们为每个传入的数据包分配了一个新的 ByteBuffer。如果我们可以重新使用一个大的循环缓冲区来对新数据进行入队和出队,那就更好了。我已经写了一篇关于此事的帖子,并提出了一个解决方案,在这里解释起来相当冗长。你可以read it here .

关于android - MediaMuxer.nativeWriteSampleData 在视频录制期间总是周期性地阻塞大约一秒钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29283342/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com