Skip to content

Commit

Permalink
为相机功能增加了时间戳,之前相机传的图像经常不动和回退,原因是没有时间戳,现在相机功能正常了。
Browse files Browse the repository at this point in the history
  • Loading branch information
lijundacom committed Aug 23, 2016
1 parent 1097bff commit eeb43fa
Show file tree
Hide file tree
Showing 21 changed files with 127 additions and 59 deletions.
Binary file modified .gradle/2.10/taskArtifacts/cache.properties.lock
Binary file not shown.
Binary file modified .gradle/2.10/taskArtifacts/fileHashes.bin
Binary file not shown.
Binary file modified .gradle/2.10/taskArtifacts/fileSnapshots.bin
Binary file not shown.
Binary file modified .gradle/2.10/taskArtifacts/outputFileStates.bin
Binary file not shown.
Binary file modified .gradle/2.10/taskArtifacts/taskArtifacts.bin
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/app.iml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
public class CameraManagerFragment extends Fragment
implements FragmentCompat.OnRequestPermissionsResultCallback {

private boolean VERBOSE = false;
private boolean VERBOSE = true;
private static volatile CameraManagerFragment cameraManagerFragment;

public static CameraManagerFragment getInstance(){
Expand Down Expand Up @@ -510,6 +510,7 @@ private void openCamera(int width, int height) {
private void closeCamera() {
if(VERBOSE)Log.v(TAG,"private void closeCamera()");
try {
Log.v(TAG,"关闭了相机,获取了锁");
mCameraOpenCloseLock.acquire();
closePreviewSession();
if (null != mCameraDevice) {
Expand All @@ -524,6 +525,7 @@ private void closeCamera() {
throw new RuntimeException("Interrupted while trying to lock camera closing.");
} finally {
mCameraOpenCloseLock.release();
Log.v(TAG,"关闭了相机,并且释放了锁");
}
}

Expand Down Expand Up @@ -672,6 +674,9 @@ public void StartCreateData(){
try {
//后台线程执行
//将surface的list送入
if(mCameraDevice == null){
Log.e(TAG,"StartCreateData(): mCameraDevice == null");
}
mCameraDevice.createCaptureSession(CaptureSessionInputSurfaces, new CameraCaptureSession.StateCallback() {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import android.media.MediaCodec;
import android.media.MediaExtractor;

import com.example.ljd.mylibstreaming.LibRTSP.session.Session;

/**
* Created by ljd-pc on 2016/7/4.
*/
Expand All @@ -15,4 +17,6 @@ public MediaCodec getMediaEncorder1(){
public MediaExtractor getMediaEncorder3(){
return null;
}
public void setSession(Session session) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,17 @@ public void setSurface(Surface surface) {
}

public void stop(){
mMediaCodec.stop();
mMediaCodec.release();
mMediaCodec = null;
if(mMediaCodec != null){
try{
mMediaCodec.stop();
mMediaCodec.release();
mMediaCodec = null;
}catch (IllegalStateException e){

}
}


}

public MediaCodec getMediaEncorder1(){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.view.Surface;

import com.example.ljd.mylibstreaming.LibRTSP.quality.VideoQuality;
import com.example.ljd.mylibstreaming.LibRTSP.session.Session;

import java.io.IOException;

Expand All @@ -28,11 +29,17 @@ public class H264Encorder extends VideoEncorder {
private String mMimeType = "video/avc";



private Session session;


public H264Encorder( VideoQuality mRequestedQuality, MediaProjection mMediaProjection ) {
this.mRequestedQuality = mRequestedQuality;
this.mMediaProjection = mMediaProjection;
}

public void setSession(Session session) {
this.session = session;
}
@Override
public void encodeWithMediaCodec() throws RuntimeException {

Expand Down Expand Up @@ -63,15 +70,19 @@ private void virtualDisplay(Surface mSurface) {

mMediaProjection.createVirtualDisplay("屏幕捕捉", mRequestedQuality.getmWidth(), mRequestedQuality.getmHeight(),
mRequestedQuality.getmDensity(), DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mSurface, null, null);
mSurface, null,null);

}

public void stop(){
if(mMediaCodec!=null){
mMediaCodec.stop();
mMediaCodec.release();
mMediaCodec = null;
if(mMediaCodec != null){
try{
mMediaCodec.stop();
mMediaCodec.release();
mMediaCodec = null;
}catch (IllegalStateException e){

}
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,16 @@ public static VideoEncorderFactory getInstance(){

@Override
public MediaEncorder CreateEncorder(Session session) {
MediaEncorder mediaEncorder;
if(session.getSessionType() == 1) {
return new H264Encorder(session.getVideoQuality(), session.getMediaProjection());
mediaEncorder = new H264Encorder(session.getVideoQuality(), session.getMediaProjection());
} else if(session.getSessionType() == 3) {
return new MP4Encorder(session);
mediaEncorder =new MP4Encorder(session);
} else if(session.getSessionType() == 2){
return new CameraEncorder(session);
mediaEncorder =new CameraEncorder(session);
}else{
return null;
}
return mediaEncorder;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
* Created by ljd-pc on 2016/6/22.
*/
public class H264Packetizer extends AbstractPacketizer implements Runnable{
private boolean VERBOSE = true;
private boolean VERBOSE = false;
public final static String TAG = "H264Packetizer";

private Thread t = null;
Expand Down Expand Up @@ -131,6 +131,9 @@ private void send() throws IOException, InterruptedException {
if(session.getSessionType() == 1) {
ts = ((MediaCodecInputStream) is).getLastBufferInfo().presentationTimeUs * 1000L;
}
if(session.getSessionType() == 2) {
ts = ((MediaCodecInputStream) is).getLastBufferInfo().presentationTimeUs * 1000L;
}
if(session.getSessionType() == 3){
ts = ((MediaExtractorInputStream) is).getLastBufferInfo().presentationTimeUs * 1000L;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public RtpSocket() {
mBuffers[i][0] = (byte) Integer.parseInt("10000000",2);

/* Payload Type */
mBuffers[i][1] = (byte) 96;
mBuffers[i][1] = (byte) 96;//96以上都不表示固定的格式。是动态格式。具体表示什么要用sdp协商或者其他协议来协商

/* Byte 2,3 -> Sequence Number */
/* Byte 4,5,6,7 -> Timestamp */
Expand Down Expand Up @@ -283,7 +283,7 @@ private void setLong(byte[] buffer, long n, int begin, int end) {

/**
* Computes an average bit rate.
* 计算网络拥塞情况,调整发送端帧率、码率
* 调整发送端帧率、码率
**/
protected static class AverageBitrate {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ public class RtspServer extends Service {
protected boolean mEnabled = true;
protected int mPort = DEFAULT_RTSP_PORT;

protected WeakHashMap<MediaStream,Object> mMediaStreams = new WeakHashMap<MediaStream,Object>();
protected WeakHashMap<MediaCodec,Object> mMediaCodecs = new WeakHashMap<MediaCodec,Object>();
protected ArrayList<MediaExtractor> mediaExtractors = new ArrayList<MediaExtractor>();
protected WeakHashMap<MediaStream,MediaStream> mMediaStreams = new WeakHashMap<MediaStream,MediaStream>();
protected WeakHashMap<MediaCodec,MediaCodec> mMediaCodecs = new WeakHashMap<MediaCodec,MediaCodec>();
protected WeakHashMap<MediaExtractor,MediaExtractor> mediaExtractors = new WeakHashMap<MediaExtractor,MediaExtractor>();
private RequestListener mListenerThread;
private final IBinder mBinder = new LocalBinder();
private boolean mRestart = false;
Expand Down Expand Up @@ -171,18 +171,18 @@ public void stop() {
try {
if(VERBOSE) Log.v(TAG,"mListenerThread.kill()");
mListenerThread.kill();
for ( MediaStream mediaStream : mMediaStreams.keySet() ) {
for ( MediaStream mediaStream : mMediaStreams.values() ) {
if ( mediaStream != null ) {
if (mediaStream.isStreaming()) mediaStream.stop();
}
}
for ( MediaCodec mediaCodec : mMediaCodecs.keySet() ) {
for ( MediaCodec mediaCodec : mMediaCodecs.values() ) {
if ( mediaCodec != null ) {
mediaCodec.release();
mediaCodec.stop();
}
}
for(MediaExtractor mediaExtractor : mediaExtractors){
for(MediaExtractor mediaExtractor : mediaExtractors.values()){
if(mediaExtractor != null){
mediaExtractor.release();
}
Expand All @@ -197,7 +197,7 @@ public void stop() {

/** Returns whether or not the RTSP server is streaming to some client(s). */
public boolean isStreaming() {
for ( MediaStream mediaStream : mMediaStreams.keySet() ) {
for ( MediaStream mediaStream : mMediaStreams.values() ) {
if ( mediaStream != null ) {
if (mediaStream.isStreaming()) return true;
}
Expand Down Expand Up @@ -314,6 +314,7 @@ public void run() {
while (!Thread.interrupted()) {
try {
//可接收多个客户端
//mServer.accept()会阻塞到这里直到有新的连接
new WorkerThread(mServer.accept()).start();
Log.v(TAG,"新的客户端连接");
} catch (SocketException e) {
Expand Down Expand Up @@ -418,6 +419,7 @@ public void run() {
mediaEncorder.stop();
}


// if (streaming && !isStreaming()) {
// postMessage(MESSAGE_STREAMING_STOPPED);
// }
Expand Down Expand Up @@ -453,46 +455,55 @@ public Response processRequest(Request request) throws IllegalStateException, IO
int sessionType = mSession.getSessionType();
if(sessionType == 1){
if(VERBOSE) Log.v(TAG,"sessionType == 1");
mStreamFactory = VideoStreamFactory.getInstance();
mEncorderFactory = VideoEncorderFactory.getInstance();
//连接输入surface,准备好mediaCodec
mediaEncorder = mEncorderFactory.CreateEncorder(mSession);
mediaEncorder.encodeWithMediaCodec();
mediaCodec = mediaEncorder.getMediaEncorder1();
//传入mediaCodec,从输出buffer读数据
mediaStream = mStreamFactory.CreateStream(mediaCodec,null,mSession);
mMediaCodecs.put(mediaCodec,mediaCodec);
mMediaStreams.put(mediaStream,mediaStream);

mStreamFactory = VideoStreamFactory.getInstance();
mEncorderFactory = VideoEncorderFactory.getInstance();
//连接输入surface,准备好mediaCodec
mediaEncorder = mEncorderFactory.CreateEncorder(mSession);
mediaEncorder.encodeWithMediaCodec();
mediaCodec = mediaEncorder.getMediaEncorder1();
//传入mediaCodec,从输出buffer读数据
mediaStream = mStreamFactory.CreateStream(mediaCodec,null,mSession);
mMediaCodecs.put(mediaCodec,mediaCodec);
mMediaStreams.put(mediaStream,mediaStream);


}
if(sessionType == 2){
if(VERBOSE) Log.v(TAG,"sessionType == 2");
mStreamFactory = VideoStreamFactory.getInstance();
mEncorderFactory = VideoEncorderFactory.getInstance();
cameraManagerFragment = CameraManagerFragment.getInstance();
//连接输入surface,准备好mediaCodec
Size videoSize = cameraManagerFragment.getVideoSize();
mSession.getVideoQuality().setmWidth(videoSize.getWidth());
mSession.getVideoQuality().setmHeight(videoSize.getHeight());
mediaEncorder = mEncorderFactory.CreateEncorder(mSession);
mediaEncorder.encodeWithMediaCodec();
mediaCodec = mediaEncorder.getMediaEncorder1();
Surface surface = ((CameraEncorder)mediaEncorder).getSurface();
cameraManagerFragment.SetMediaCodecInputSurface(surface);
cameraManagerFragment.StartCreateData();
//传入mediaCodec,从输出buffer读数据
mediaStream = mStreamFactory.CreateStream(mediaCodec,null,mSession);
mMediaCodecs.put(mediaCodec,mediaCodec);
mMediaStreams.put(mediaStream,mediaStream);

mStreamFactory = VideoStreamFactory.getInstance();
mEncorderFactory = VideoEncorderFactory.getInstance();
cameraManagerFragment = CameraManagerFragment.getInstance();
//连接输入surface,准备好mediaCodec
Size videoSize = cameraManagerFragment.getVideoSize();
mSession.getVideoQuality().setmWidth(videoSize.getWidth());
mSession.getVideoQuality().setmHeight(videoSize.getHeight());
mediaEncorder = mEncorderFactory.CreateEncorder(mSession);
mediaEncorder.encodeWithMediaCodec();
mediaCodec = mediaEncorder.getMediaEncorder1();
Surface surface = ((CameraEncorder)mediaEncorder).getSurface();
cameraManagerFragment.SetMediaCodecInputSurface(surface);
cameraManagerFragment.StartCreateData();
//传入mediaCodec,从输出buffer读数据
mediaStream = mStreamFactory.CreateStream(mediaCodec,null,mSession);
mMediaCodecs.put(mediaCodec,mediaCodec);
mMediaStreams.put(mediaStream,mediaStream);

}
if(sessionType == 3){
if(VERBOSE) Log.v(TAG,"sessionType == 3");
mStreamFactory = VideoStreamFactory.getInstance();
mEncorderFactory = VideoEncorderFactory.getInstance();
mediaEncorder = mEncorderFactory.CreateEncorder(mSession);
mediaExtractor = mediaEncorder.getMediaEncorder3();
mediaStream = mStreamFactory.CreateStream(null,mediaExtractor,mSession);
mediaExtractors.add(mediaExtractor);
mMediaStreams.put(mediaStream,mediaStream);


mStreamFactory = VideoStreamFactory.getInstance();
mEncorderFactory = VideoEncorderFactory.getInstance();
mediaEncorder = mEncorderFactory.CreateEncorder(mSession);
mediaExtractor = mediaEncorder.getMediaEncorder3();
mediaStream = mStreamFactory.CreateStream(null,mediaExtractor,mSession);
mediaExtractors.put(mediaExtractor,mediaExtractor);
mMediaStreams.put(mediaStream,mediaStream);


}
//mSessions.put(mSession, null);
mediaStream.configure(mSession);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ public class Session {
private int TYPE_VIDEO_H264 = 1;
private int TYPE_VIDEO_CAMERA = 2;
private int TYPE_VIDEO_MP4_FILE = 3;



private Handler mediaProjectionHandler;
//private int TYPE_AUDIO_ = ...


Expand Down Expand Up @@ -220,7 +224,13 @@ public VideoQuality getFileVideoQulity() {
public void setFileVideoQulity(VideoQuality fileVideoQulity) {
this.fileVideoQulity = fileVideoQulity;
}
public Handler getMediaProjectionHandler() {
return mediaProjectionHandler;
}

public void setMediaProjectionHandler(Handler handler) {
this.mediaProjectionHandler = handler;
}
/**
* Returns a Session Description that can be stored in a file or sent to a client with RTSP.
* @return The Session Description.
Expand Down
Loading

0 comments on commit eeb43fa

Please sign in to comment.