有大神研究Android APP连接UVC摄像头的吗,怎么获取提取使用视频流啊

不减肥就是� 2019-08-29 04:13:55
我已经能预览了,依赖库里好像有视频流采集,我不太懂这块,有人可以帮我看看嘛
@SuppressWarnings("deprecation")
protected void drain() {
if (mMediaCodec == null)
return;
ByteBuffer[] encoderOutputBuffers = mMediaCodec.getOutputBuffers();
int encoderStatus, count = 0;
final MediaMuxerWrapper muxer = mWeakMuxer.get();
if (muxer == null) {
Log.w(TAG, "muxer is unexpectedly null");
return;
}
byte[] mPpsSps = new byte[0];
byte[] h264 = new byte[640 * 480];

while (mIsCapturing) {
encoderStatus = mMediaCodec.dequeueOutputBuffer(mBufferInfo, TIMEOUT_USEC);
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
// 等待 TIMEOUT_USEC x 5 = 50毫秒
// 如果还没有数据,终止循环
if (!mIsEOS) {
if (++count > 5)
break;
}
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
encoderOutputBuffers = mMediaCodec.getOutputBuffers();
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
if (mMuxerStarted) {
throw new RuntimeException("format changed twice");
}
final MediaFormat format = mMediaCodec.getOutputFormat();
mTrackIndex = muxer.addTrack(format);
mMuxerStarted = true;
if (!muxer.start()) {
synchronized (muxer) {
while (!muxer.isStarted())
try {
muxer.wait(100);
} catch (final InterruptedException e) {
break;
}
}
}
} else if (encoderStatus < 0) {
if (DEBUG) Log.w(TAG, "drain:unexpected result from encoder#dequeueOutputBuffer: " + encoderStatus);
} else {
ByteBuffer encodedData;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
encodedData = mMediaCodec.getOutputBuffer(encoderStatus);
} else {
encodedData = encoderOutputBuffers[encoderStatus];
}
encodedData.position(mBufferInfo.offset);
encodedData.limit(mBufferInfo.offset + mBufferInfo.size);

// final ByteBuffer encodedData = encoderOutputBuffers[encoderStatus];
if (encodedData == null) {
throw new RuntimeException("encoderOutputBuffer " + encoderStatus + " was null");
}
// BUFFER_FLAG_CODEC_CONFIG标志
// BufferInfo清零
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
if (DEBUG) Log.d(TAG, "drain:BUFFER_FLAG_CODEC_CONFIG");
mBufferInfo.size = 0;
}
// BUFFER_FLAG_END_OF_STREAM标志
// 流结束,终止循环
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
mMuxerStarted = mIsCapturing = false;
break;
}
// 有效编码数据流
if (mBufferInfo.size != 0) {
count = 0;
if (!mMuxerStarted) {
throw new RuntimeException("drain:muxer hasn't started");
}
// 写入音频流或视频流到混合器
mBufferInfo.presentationTimeUs = getPTSUs();
muxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo);
prevOutputPTSUs = mBufferInfo.presentationTimeUs;

// 推流,获取h.264数据流
// mTrackIndex=0 视频;mTrackIndex=1 音频
if(mTrackIndex == 0) {
encodedData.position(mBufferInfo.offset);
encodedData.limit(mBufferInfo.offset + mBufferInfo.size);
boolean sync = false;
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {// sps
sync = (mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0;
if (!sync) {
byte[] temp = new byte[mBufferInfo.size];
encodedData.get(temp);
mPpsSps = temp;
mMediaCodec.releaseOutputBuffer(encoderStatus, false);
continue;
} else {
mPpsSps = new byte[0];
}
}
sync |= (mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0;
int len = mPpsSps.length + mBufferInfo.size;
if (len > h264.length) {
h264 = new byte[len];
}
if (sync)
{
System.arraycopy(mPpsSps, 0, h264, 0, mPpsSps.length);
encodedData.get(h264, mPpsSps.length, mBufferInfo.size);
if(mListener != null)
{
mListener.onEncodeResult(h264, 0,mPpsSps.length + mBufferInfo.size,
mBufferInfo.presentationTimeUs / 1000,TYPE_VIDEO);
}
// 保存数据流到文件
FileUtils.putFileStream(h264, 0,mPpsSps.length + mBufferInfo.size);
}
else
{
encodedData.get(h264, 0, mBufferInfo.size);
if(mListener != null)
{
mListener.onEncodeResult(h264, 0,mBufferInfo.size,
mBufferInfo.presentationTimeUs / 1000,TYPE_VIDEO);
}
FileUtils.putFileStream(h264, 0,mBufferInfo.size);
}
} else if(mTrackIndex == 1){
mBuffer.clear();
encodedData.get(mBuffer.array(), 7, mBufferInfo.size);
encodedData.clear();
mBuffer.position(7 + mBufferInfo.size);
addADTStoPacket(mBuffer.array(), mBufferInfo.size + 7);
mBuffer.flip();
if(mListener != null){
mListener.onEncodeResult(mBuffer.array(),0, mBufferInfo.size + 7,
mBufferInfo.presentationTimeUs / 1000,TYPE_AUDIO);
}
}
}
// 释放输出缓存,将其还给编码器
mMediaCodec.releaseOutputBuffer(encoderStatus, false);
}
}
}



这是UVC调用的库里面的一段
...全文
573 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kilimanjarox 应用层 2021-09-14
  • 打赏
  • 举报
回复

请问您解决了吗?

何以解惑 2019-11-23
  • 打赏
  • 举报
回复
拿到他的回调数据,就可以监测数据了,我就是用uvc人脸识别
kilimanjarox 应用层 2021-09-14
  • 举报
回复
@何以解惑 请问您怎么拿到回掉调数据啊?
gxh_apologize 2019-09-04
  • 打赏
  • 举报
回复
具体见上文。 其实可以直接原生Camera预览的。数据流有个回调方法的。 人脸识别文章里也有介绍。如果商用的话,最好还是使用大公司sdk。
gxh_apologize 2019-09-04
  • 打赏
  • 举报
回复
https://blog.csdn.net/GXH_APOLOGIZE/article/details/90514618
不减肥就是� 2019-08-29
  • 打赏
  • 举报
回复
新人求救啊,太纠结了,怎么都弄不好,或者有谁会直接检测人脸吗,用UVC摄像头,我已经能预览了

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧