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

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

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