将Android设备当成摄像头IPC 实现RTSP 服务器功能 vlc可以直接观看 MediaCodec 编码出来的没有SPS PPS 数据

之前调试过在android手机上 读取摄像头 然后 rtmp推流 或者用ffmpeg拉RTSP的流

这次是需要将Android手机当成一个IPC摄像头,在手机上起一个rtsp server的功能,然后客户端可以直接观看手机摄像头的内容 :

今天刚调试能出来 有点乱 简单记录下:

先看下效果图

启动app显示如下:

点击Test QMCY 左上方按钮上显示的是手机上摄像头的总个数

点一下按钮会在不通摄像头之间切换

电脑上用vlc打开 rtsp流地址 即可看到手机上摄像头的实时视频流

将Android设备当成摄像头IPC 实现RTSP 服务器功能 vlc可以直接观看 MediaCodec 编码出来的没有SPS PPS 数据_第1张图片

将Android设备当成摄像头IPC 实现RTSP 服务器功能 vlc可以直接观看 MediaCodec 编码出来的没有SPS PPS 数据_第2张图片

项目工程结构:

将Android设备当成摄像头IPC 实现RTSP 服务器功能 vlc可以直接观看 MediaCodec 编码出来的没有SPS PPS 数据_第3张图片

这个RTSP 用的是 之前花钱买的一个带源码的RTSP版本,本身是支持Android 

IOS  WINDOWS  Linux  嵌入式Linux等等,

但是 android版本一直没弄好 。就在原来的嵌入式linux版本上移植过来了 

刚开始调试的时候是直接推RTMP服务器的  也可以直接观看 ,后来起RTSP服务器 推流的时候 看不起来  分析码流 发现 mediacodec直接编码出来的码流 只有 I帧和P帧 没有SPS PPS的数据

如下图:

将Android设备当成摄像头IPC 实现RTSP 服务器功能 vlc可以直接观看 MediaCodec 编码出来的没有SPS PPS 数据_第4张图片

 可以发现只有实时码流只有I帧和P帧 没有SPS PPS信息 。

但是不知道为什么RTMP的可以观看  ,根据以往的经验就直接把SPS PPS和I帧拼接成一帧了 

将Android设备当成摄像头IPC 实现RTSP 服务器功能 vlc可以直接观看 MediaCodec 编码出来的没有SPS PPS 数据_第5张图片

 MediaCodec可以得到SPS PPS 的数据 

然后检测到I帧的时候 将SPS PPS 和I帧 拼接成一个packet发送出去 ,这样 vlc就正常能观看视频了 

对java不太熟悉 不太确定这段代码有没有问题  不过当成demo还是ok的

你可能感兴趣的:(音视频,android)