实例介绍
【实例简介】说明:该android代码h263硬编码rtp打包发送服务器,pc端建立sdp文件用vlc播放
1、服务器ip为192.168.1.6
2、android手机ip为192.168.1.17,在小米1s测试通过,像三星等手机不支持h263编码
3、android端修改net.config包下的Config类的url
4、pc端用已有的sdp文件播放,修改ip为手机ip
1、服务器ip为192.168.1.6
2、android手机ip为192.168.1.17,在小米1s测试通过,像三星等手机不支持h263编码
3、android端修改net.config包下的Config类的url
4、pc端用已有的sdp文件播放,修改ip为手机ip
【实例截图】
【核心代码】
package com.lee.h263recorder.activity; import java.io.IOException; import java.net.InetAddress; import net.config.Config; import net.majorkernelpanic.rtp.AbstractPacketizer; import net.majorkernelpanic.rtp.H263Packetizer; import android.media.MediaRecorder; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.util.Log; import android.view.Menu; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.SurfaceHolder.Callback; public class Main extends Activity implements Callback{ private static final String TAG = "VideoCamera"; SharedPreferences sharedPreferences; private final String mediaShare = "media"; //初始化LocalServerSocket LocalSocket LocalServerSocket lss; LocalSocket receiver, sender; protected AbstractPacketizer packetizer = null; protected boolean streaming = false, modeDefaultWasUsed = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); InitSurfaceView(); InitMediaSharePreference(); InitAbstractPacketizer(); } private void InitAbstractPacketizer() { try { packetizer = new H263Packetizer(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //初始化SurfaceView private SurfaceView mSurfaceView; private void InitSurfaceView() { mSurfaceView = (SurfaceView) this.findViewById(R.id.surface_camera); SurfaceHolder holder = mSurfaceView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceView.setVisibility(View.VISIBLE); } private void InitMediaSharePreference() { sharedPreferences = this.getSharedPreferences(mediaShare, MODE_PRIVATE); } private SurfaceHolder mSurfaceHolder; private boolean mMediaRecorderRecording = false; public void surfaceCreated(SurfaceHolder holder) { mSurfaceHolder = holder; } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mSurfaceHolder = holder; if(!mMediaRecorderRecording) { InitLocalSocket(); initializeVideo(); startVideoRecording(); } } public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } private void InitLocalSocket(){ try { lss = new LocalServerSocket("H263"); receiver = new LocalSocket(); receiver.connect(new LocalSocketAddress("H263")); receiver.setReceiveBufferSize(500000); sender = lss.accept(); sender.setSendBufferSize(500000); } catch (IOException e) { Log.e(TAG, e.toString()); this.finish(); return; } } //初始化MediaRecorder private MediaRecorder mMediaRecorder = null; private int videoWidth = 640; //352 private int videoHeight = 480; //288 private int videoRate = 24; //15 private boolean initializeVideo(){ if(mSurfaceHolder == null) { return false; } mMediaRecorderRecording = true; if(mMediaRecorder == null) { mMediaRecorder = new MediaRecorder(); } else { mMediaRecorder.reset(); } mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setVideoFrameRate(videoRate); mMediaRecorder.setVideoSize(videoWidth, videoHeight); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); mMediaRecorder.setMaxDuration(0); mMediaRecorder.setMaxFileSize(Integer.MAX_VALUE); mMediaRecorder.setOutputFile(sender.getFileDescriptor()); try { mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); releaseMediaRecorder(); } return true; } //释放MediaRecorder资源 private void releaseMediaRecorder(){ if(mMediaRecorder != null) { if(mMediaRecorderRecording) { mMediaRecorder.stop(); mMediaRecorderRecording = false; } mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } } //开始录像,启动线程 private void startVideoRecording() { try { setDestination(InetAddress.getByName(Config.host),Config.video_port); packetizer.setInputStream(receiver.getInputStream()); packetizer.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { return true; } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if(mMediaRecorderRecording) { releaseMediaRecorder(); try { lss.close(); receiver.close(); sender.close(); } catch (IOException e) { Log.e(TAG, e.toString()); } mMediaRecorderRecording = false; } finish(); } /** The stream will be sent to the address specified by this function **/ public void setDestination(InetAddress dest, int dport) { this.packetizer.setDestination(dest, dport); } /** Set the Time To Live of the underlying RtpSocket * @throws IOException **/ public void setTimeToLive(int ttl) throws IOException { this.packetizer.setTimeToLive(ttl); } public int getDestinationPort() { return this.packetizer.getRtpSocket().getPort(); } public int getLocalPort() { return this.packetizer.getRtpSocket().getLocalPort(); } public void setMode(int mode) throws IllegalStateException { if (!streaming) { modeDefaultWasUsed = true; } else { throw new IllegalStateException("You can't call setMode() while streaming !"); } } public AbstractPacketizer getPacketizer() { return packetizer; } public boolean isStreaming() { return streaming; } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论