提交 ed6a66cd authored 作者: autulin's avatar autulin

大改造之使用新的API来完成读写分离,但是仍旧拯救不了性能

上级 e6b27d10
...@@ -46,15 +46,15 @@ void *GB28181_sender::processSend(void *obj) { ...@@ -46,15 +46,15 @@ void *GB28181_sender::processSend(void *obj) {
uint16_t len = bytes2short(pkt_buf); uint16_t len = bytes2short(pkt_buf);
uint64_t t1 = getCurrentTime(); uint64_t t1 = getCurrentTime();
// char strBuf[16]; ssize_t n;
// sprintf(strBuf, "get pkt len: %d", len);
int n;
switch (gb28181Sender->args->outType) { switch (gb28181Sender->args->outType) {
case 0: // udp case 0: // udp
n = gb28181Sender->sendData(pkt_buf + 2, len); n = gb28181Sender->sendData(pkt_buf + 2, len);
LOGE("[sender]get pkt len: %d. sent %d. (queue left size: %d)", len, n, gb28181Sender->pkt_queue.size()); LOGI("[sender][udp]get pkt len: %d. sent %ld. (queue left size: %d)", len, n, gb28181Sender->pkt_queue.size());
break; break;
case 1: // tcp case 1: // tcp
n = gb28181Sender->sendData(pkt_buf, len + 2);
LOGI("[sender][tcp]get pkt len: %d. sent %ld. (queue left size: %d)", len, n, gb28181Sender->pkt_queue.size());
break; break;
case 2: // file case 2: // file
gb28181Sender->fout.write((const char *) (pkt_buf + 2), len); gb28181Sender->fout.write((const char *) (pkt_buf + 2), len);
...@@ -104,13 +104,23 @@ int GB28181_sender::closeSender() { ...@@ -104,13 +104,23 @@ int GB28181_sender::closeSender() {
} }
int GB28181_sender::initSocket(char *hostname, int port) { int GB28181_sender::initSocket(char *hostname, int port) {
//todo switch (args->outType) {
case 0: // udp
sockfd = socket(AF_INET, SOCK_DGRAM, 0); sockfd = socket(AF_INET, SOCK_DGRAM, 0);
break;
case 1: // tcp
sockfd = socket(AF_INET, SOCK_STREAM, 0);
break;
default:
sockfd = -99;
}
if (sockfd < 0){ if (sockfd < 0){
LOGE("ERROR opening socket"); LOGE("ERROR opening socket.(%d)", sockfd);
return sockfd; return sockfd;
} }
// 域名解析相关
// struct hostent *server; // struct hostent *server;
// server = gethostbyname(hostname); // server = gethostbyname(hostname);
// if (server == NULL) { // if (server == NULL) {
...@@ -127,11 +137,32 @@ int GB28181_sender::initSocket(char *hostname, int port) { ...@@ -127,11 +137,32 @@ int GB28181_sender::initSocket(char *hostname, int port) {
serveraddr.sin_port = htons(port); serveraddr.sin_port = htons(port);
serverlen = sizeof(serveraddr); serverlen = sizeof(serveraddr);
if (args->outType == 1) { // tcp
int ret = connect(sockfd, (const sockaddr *) &serveraddr, serverlen);
if (ret < 0){
LOGE("ERROR connect.(%d)", ret);
return ret;
}
}
return 0; return 0;
} }
int GB28181_sender::sendData(uint8_t *buf, int len) { ssize_t GB28181_sender::sendData(uint8_t *buf, int len) {
int n = sendto(sockfd, buf, len, 0, (const sockaddr *) &serveraddr, serverlen); ssize_t n = 0;
switch (args->outType) {
case 0: // udp
n = sendto(sockfd, buf, len, 0, (const sockaddr *) &serveraddr, serverlen);
break;
case 1: // tcp
n = send(sockfd, buf, len, 0);
break;
default:
return -1;
}
if (n < 0) {
LOGE("send error.(%ld)", n);
}
return n; return n;
} }
......
...@@ -47,7 +47,7 @@ private: ...@@ -47,7 +47,7 @@ private:
int serverlen; int serverlen;
int initSocket(char* hostname, int port); int initSocket(char* hostname, int port);
int sendData(uint8_t * buf, int len); ssize_t sendData(uint8_t * buf, int len);
int closeSocket(); int closeSocket();
......
...@@ -21,6 +21,7 @@ public: ...@@ -21,6 +21,7 @@ public:
int initMuxer(); int initMuxer();
static void* startMux(void *obj); static void* startMux(void *obj);
static void* startEncode(void *obj);
int sendVideoFrame(uint8_t *buf); int sendVideoFrame(uint8_t *buf);
...@@ -43,6 +44,7 @@ private: ...@@ -43,6 +44,7 @@ private:
GB28181_sender *gb28181Sender; GB28181_sender *gb28181Sender;
int is_end = START_STATE; int is_end = START_STATE;
int is_release = RELEASE_FALSE; int is_release = RELEASE_FALSE;
threadsafe_queue<AVFrame *> vFrame_queue;
threadsafe_queue<uint8_t *> video_queue; threadsafe_queue<uint8_t *> video_queue;
threadsafe_queue<uint8_t *> audio_queue; threadsafe_queue<uint8_t *> audio_queue;
AVFormatContext *pFormatCtx; AVFormatContext *pFormatCtx;
...@@ -61,6 +63,13 @@ private: ...@@ -61,6 +63,13 @@ private:
int64_t startTime = 0; int64_t startTime = 0;
int in_y_size; int in_y_size;
//合成相关的参数
int g711aFrameLen = 0;
int64_t lastPts = 0;
int64_t frameAppend = 0;
int scrPerFrame;
int muxCnt = 0;
int mux(GB28181Muxer *gb28181Muxer); int mux(GB28181Muxer *gb28181Muxer);
AVFrame * genFrame(uint8_t *rawData); AVFrame * genFrame(uint8_t *rawData);
}; };
......
...@@ -32,7 +32,7 @@ Java_com_autulin_gb28181library_JNIBridge_initMuxer(JNIEnv *env, jclass type, js ...@@ -32,7 +32,7 @@ Java_com_autulin_gb28181library_JNIBridge_initMuxer(JNIEnv *env, jclass type, js
jstring mediaBasePath_, jstring mediaName_, jstring mediaBasePath_, jstring mediaName_,
jint filter, jint in_width, jint in_height, jint filter, jint in_width, jint in_height,
jint out_width, jint out_height, jint frameRate, jint out_width, jint out_height, jint frameRate,
jlong bit_rate, jint audioFrameLen) { jlong bit_rate, jint audioFrameLen, jint ssrc) {
const char *ip = env->GetStringUTFChars(ip_, 0); const char *ip = env->GetStringUTFChars(ip_, 0);
const char *mediaBasePath = env->GetStringUTFChars(mediaBasePath_, 0); const char *mediaBasePath = env->GetStringUTFChars(mediaBasePath_, 0);
const char *mediaName = env->GetStringUTFChars(mediaName_, 0); const char *mediaName = env->GetStringUTFChars(mediaName_, 0);
...@@ -44,8 +44,7 @@ Java_com_autulin_gb28181library_JNIBridge_initMuxer(JNIEnv *env, jclass type, js ...@@ -44,8 +44,7 @@ Java_com_autulin_gb28181library_JNIBridge_initMuxer(JNIEnv *env, jclass type, js
strcpy(arguments->ip_addr, ip); strcpy(arguments->ip_addr, ip);
arguments->port = port; arguments->port = port;
arguments->outType = outType; arguments->outType = outType;
arguments->media_base_path = mediaBasePath; arguments->ssrc = ssrc;
arguments->media_name = mediaName;
size_t m_path_size = strlen(mediaBasePath) + strlen(mediaName) + strlen(MEDIA_FORMAT) + 1; size_t m_path_size = strlen(mediaBasePath) + strlen(mediaName) + strlen(MEDIA_FORMAT) + 1;
arguments->media_path = (char *) malloc(m_path_size + 1); arguments->media_path = (char *) malloc(m_path_size + 1);
......
...@@ -9,8 +9,6 @@ typedef struct UserArguments { ...@@ -9,8 +9,6 @@ typedef struct UserArguments {
char *ip_addr; char *ip_addr;
int port; int port;
int outType; int outType;
const char *media_base_path; //文件储存地址
const char *media_name; // 文件命令前缀
char *media_path; //合成后的MP4储存地址 char *media_path; //合成后的MP4储存地址
int in_width; //输出宽度 int in_width; //输出宽度
int in_height; //输入高度 int in_height; //输入高度
...@@ -20,6 +18,7 @@ typedef struct UserArguments { ...@@ -20,6 +18,7 @@ typedef struct UserArguments {
int64_t video_bit_rate; //视频比特率控制 int64_t video_bit_rate; //视频比特率控制
int v_custom_format; //一些滤镜操作控制 int v_custom_format; //一些滤镜操作控制
int a_frame_len; int a_frame_len;
int ssrc;
JNIEnv *env; //env全局指针 JNIEnv *env; //env全局指针
JavaVM *javaVM; //jvm指针 JavaVM *javaVM; //jvm指针
jclass java_class; //java接口类的calss对象 jclass java_class; //java接口类的calss对象
......
...@@ -119,8 +119,9 @@ public class DemoActivity extends AppCompatActivity implements ...@@ -119,8 +119,9 @@ public class DemoActivity extends AppCompatActivity implements
// 设置输出 // 设置输出
// String fileName = String.valueOf(System.currentTimeMillis()); // String fileName = String.valueOf(System.currentTimeMillis());
String fileName = "tttttt"; String fileName = "tttttt";
// mediaOutput = mMediaRecorder.setFileOutPut(fileName); //输出到文件,这里demo是/sdcard/DCIM/pstest/tttttt.ps mediaOutput = mMediaRecorder.setFileOutPut(fileName); //输出到文件,这里demo是/sdcard/DCIM/pstest/tttttt.ps
mediaOutput = mMediaRecorder.setUdpOutPut("10.112.181.160", 8888); // int ssrc = 1;
// mediaOutput = mMediaRecorder.setUdpOutPut("10.112.181.160", 8888, ssrc);
mMediaRecorder.setSurfaceHolder(mSurfaceView.getHolder()); mMediaRecorder.setSurfaceHolder(mSurfaceView.getHolder());
mMediaRecorder.prepare(); mMediaRecorder.prepare();
......
...@@ -64,7 +64,8 @@ public class JNIBridge { ...@@ -64,7 +64,8 @@ public class JNIBridge {
int out_height, int out_height,
int frameRate, int frameRate,
long bit_rate, long bit_rate,
int audioFrameLen int audioFrameLen,
int ssrc
); );
public static native int sendOneVideoFrame(byte[] data); public static native int sendOneVideoFrame(byte[] data);
......
...@@ -6,13 +6,15 @@ public class MediaOutput { ...@@ -6,13 +6,15 @@ public class MediaOutput {
private String outputDir; private String outputDir;
private String outputName; private String outputName;
private int outputType; private int outputType;
private int ssrc;
public MediaOutput(String ip, int port, String outputDir, String outputName, int outputType) { public MediaOutput(String ip, int port, String outputDir, String outputName, int outputType, int ssrc) {
this.ip = ip; this.ip = ip;
this.port = port; this.port = port;
this.outputDir = outputDir; this.outputDir = outputDir;
this.outputName = outputName; this.outputName = outputName;
this.outputType = outputType; this.outputType = outputType;
this.ssrc = ssrc;
} }
public String getIp() { public String getIp() {
...@@ -54,4 +56,12 @@ public class MediaOutput { ...@@ -54,4 +56,12 @@ public class MediaOutput {
public void setOutputType(int outputType) { public void setOutputType(int outputType) {
this.outputType = outputType; this.outputType = outputType;
} }
public int getSsrc() {
return ssrc;
}
public void setSsrc(int ssrc) {
this.ssrc = ssrc;
}
} }
...@@ -712,13 +712,13 @@ public abstract class MediaRecorderBase implements Callback, PreviewCallback, IM ...@@ -712,13 +712,13 @@ public abstract class MediaRecorderBase implements Callback, PreviewCallback, IM
this.mFrameRateCmd= String.format(" -r %d",rate); this.mFrameRateCmd= String.format(" -r %d",rate);
} }
public MediaOutput setTcpOutPut(String ip, int port) { public MediaOutput setTcpOutPut(String ip, int port, int ssrc) {
mediaOutput = new MediaOutput(ip, port, "", "", JNIBridge.TCP); mediaOutput = new MediaOutput(ip, port, "", "", JNIBridge.TCP, ssrc);
return mediaOutput; return mediaOutput;
} }
public MediaOutput setUdpOutPut(String ip, int port) { public MediaOutput setUdpOutPut(String ip, int port, int ssrc) {
mediaOutput = new MediaOutput(ip, port, "", "", JNIBridge.UDP); mediaOutput = new MediaOutput(ip, port, "", "", JNIBridge.UDP, ssrc);
return mediaOutput; return mediaOutput;
} }
...@@ -741,7 +741,7 @@ public abstract class MediaRecorderBase implements Callback, PreviewCallback, IM ...@@ -741,7 +741,7 @@ public abstract class MediaRecorderBase implements Callback, PreviewCallback, IM
if (!file.exists()) { if (!file.exists()) {
file.mkdirs(); file.mkdirs();
} }
mediaOutput = new MediaOutput("", 0, path, fileName, JNIBridge.FILE); mediaOutput = new MediaOutput("", 0, path, fileName, JNIBridge.FILE, 0);
return mediaOutput; return mediaOutput;
} }
} }
...@@ -16,12 +16,16 @@ public class MediaRecorderNative extends MediaRecorderBase implements MediaRecor ...@@ -16,12 +16,16 @@ public class MediaRecorderNative extends MediaRecorderBase implements MediaRecor
JNIBridge.endMux(); JNIBridge.endMux();
} }
long t = System.currentTimeMillis();
/** /**
* 视频数据回调 * 视频数据回调
*/ */
@Override @Override
public void onPreviewFrame(byte[] data, Camera camera) { public void onPreviewFrame(byte[] data, Camera camera) {
if (mRecording) { if (mRecording) {
long nt = System.currentTimeMillis();
Log.e("now", "onPreviewFrame: "+ nt + ", div:" + (nt- t));
t = nt;
JNIBridge.sendOneVideoFrame(data); JNIBridge.sendOneVideoFrame(data);
mPreviewFrameCallCount++; mPreviewFrameCallCount++;
} }
...@@ -81,7 +85,8 @@ public class MediaRecorderNative extends MediaRecorderBase implements MediaRecor ...@@ -81,7 +85,8 @@ public class MediaRecorderNative extends MediaRecorderBase implements MediaRecor
SMALL_VIDEO_HEIGHT, SMALL_VIDEO_HEIGHT,
mFrameRate, mFrameRate,
mVideoBitrate, mVideoBitrate,
mAudioCollector.getFrameLen() mAudioCollector.getFrameLen(),
mediaOutput.getSsrc()
); );
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论