android - 在没有 Camera2 API 的情况下将 ImageReader 表面用于视频流
问题描述
我正在尝试将相机的视频流放入图像读取器表面,以便能够处理这些图像。我发现了很多处理 camera2 API 的示例,但我不使用它,因为我的视频流来自外部摄像头。
理想情况下,我将有两个表面:一个作为预览,另一个来自 ImageReader 来处理图像。与此类似。我了解您将两个曲面与 aCaptureRequest.Builder
和 then结合起来.addTarget(surface)
。问题是我没有CamerDevice
制作createCaptureRequest
.
我使用的代码可以在这里找到。
我试图创建一个 ImageReader 及其表面并将其传递给startDecoding
函数。但这并没有很好地工作,因为我收到了这个错误:
E/JNI: close+++++++
E/BufferQueueProducer: [ImageReader-1280x720f32315659m16-17834-0] dequeueBuffer: BufferQueue has been abandoned
E/ACodec: NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: No such device (19)
E/ACodec: Failed to allocate output port buffers after port reconfiguration: (-19)
E/ACodec: signalError(omxError 0x80001001, internalError -19)
E/MediaCodec: Codec reported err 0xffffffed, actionCode 0, while in state 6
E/AccessHeadCameraActivity: Error has occured.
java.lang.IllegalStateException
at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:2379)
任何指向正确方向的提示都会很好!
更新1:
错误是由 的返回值引起的dequeueOutputBuffer
,因为它的值为-1
。根据 MediaCodec 上的文档,这意味着呼叫超时。但是为什么会这样呢?
更新 2
我没有surfaceCreated
(因为我不再有 SurfaceView),所以代码移到了onCreate
. 其他一切都和这里差不多
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_acess_headcamera);
mediaManager = (MediaManager) getUnitManager(FuncConstant.MEDIA_MANAGER);
setupImageReader();
StreamOption streamOption = new StreamOption();
streamOption.setChannel(StreamOption.MAIN_STREAM);
streamOption.setDecodType(StreamOption.HARDWARE_DECODE);
streamOption.setJustIframe(false);
mediaManager.openStream(streamOption);
surface = imageReader.getSurface();
startDecoding(surface);
initListener();
}
private void setupImageReader() {
imageReader = ImageReader.newInstance(width, height, ImageFormat.YV12,
IMAGE_READER_BUFFER_SIZE);
imageReader.setOnImageAvailableListener(onImageAvailableListener, backgroundHandler);
}
解决方案
推荐阅读
- javascript - 如何使用 nodejs 对电子邮件进行身份验证?我收到一封用户提交电子邮件的电子邮件,然后我点击我端的链接来验证这封电子邮件
- android - 用于单元测试的模拟房间数据库
- c# - 如果在不增加重力的情况下不进行交互,如何修复可交互对象的运动
- docker - docker容器中的Nexus如何将另一台服务器配置为任务中的备份位置?
- python - Scipy KDTree 获取由两个点定义的网格的矩形子集
- javascript - 当入口点未定义时,webpack 会发生什么?
- c# - 如何将新的外部列添加到 .XLSX 文件目标?
- javascript - 如何过滤谷歌正文文档中的文本以更改其样式?
- python - 未加载静态文件(Django 1.11)
- c++ - 如何实现类似 std::copy_if 但在插入不同容器之前应用函数