【发布时间】:2015-01-23 06:26:14
【问题描述】:
我正在尝试制作 android 应用程序,它将相机输出作为 rtp 流发送到服务器,但它没有按预期工作。 我正在执行以下步骤
在Activity类中实现
SurfaceTextureListener接口,在onCreate()中创建TextureView并添加监听器。-
在
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)方法中创建并初始化Camera和MediaCodec实例以将相机输出编码为H.264。还为相机添加了 PreviewCallback 如下 -mCamera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // Here encode method will encode frame using Mediacodec and send it to LocalSocket. encode(data); } }); 现在另一个
AsyncTask将读取这个LocalSocket并通过在每个数据包中添加RTP 标头将其发送到DatagramSocket。- 我正在通过提供 sdp 文件在 VLC 上测试此代码,但 VLC 没有播放任何视频。如果我在 VLC
udp://@:5001中打开 udp 套接字 然后在媒体信息中,VLC 在“Read At Media”和“Input Bitrate”中显示了一些数据,这意味着我的应用正在向该 udp 端口发送一些数据。 我还尝试将视频保存到 android 设备中,我的应用正在从相同的MediaCoded和Camera代码中保存正确的视频。
RTP Header 和数据包形成代码
int Version; // 2 bits
int Padding; // 1 bit
int Extension; // 1 bit
int CC; // 4 bits
int Marker; // 1 bit
int PayloadType=96; // 7 bits
int Ssrc; // 32 bits
Version = 2;
Padding = 0;
Extension = 0;
CC = 0;
Marker = 0;
Ssrc = 0;
byte[] header = new byte[ 12 ];
long timeStamp = System.currentTimeMillis();
mSeq = ++mSeq + 1;
header[0] = (byte)(Version << 6);
header[0] = (byte)(header[0] | Padding << 5);
header[0] = (byte)(header[0] | Extension << 4);
header[0] = (byte)(header[0] | CC);
header[1] = (byte)(header[1] | Marker << 7);
header[1] = (byte)(header[1] | PayloadType);
header[2] = (byte)(mSeq >> 8);
header[3] = (byte)(mSeq & 0xFF);
header[4] = (byte)(timeStamp >> 24);
header[5] = (byte)(timeStamp >> 16);
header[6] = (byte)(timeStamp >> 8);
header[7] = (byte)(timeStamp & 0xFF);
header[8] = (byte)(Ssrc >> 24);
header[9] = (byte)(Ssrc >> 16);
header[10] = (byte)(Ssrc >> 8);
header[11] = (byte)(Ssrc & 0xFF);
mBuffers = new byte[1400];
System.arraycopy(header, 0, mBuffers, 0, header.length);
System.arraycopy(buf, 0, mBuffers, 12, buf.length);
DatagramPacket out = new DatagramPacket(mBuffers, mBuffers.length, hostAddress, 5001);
socket.send(out);
我试图通过删除数据包的前 4 个字节来修复我的代码,因为 stackoverflow 中有人说在 AVC 中我们需要删除第一个 4 个字节。还检查了我的 RTP 标头两次,但没有运气...
知道为什么我的代码无法将视频作为 rtp 发送吗?
【问题讨论】:
-
code.google.com/p/spydroid-ipcamera 查找将数据包设置为 rtp 的位置
标签: android android-camera rtp android-mediacodec