while(1){ // lasttime = RTMP_GetTime(); ringget(&ringinfo); int bKeyframe = (ringinfo.frame_type == 1) ? TRUE : FALSE; if(bKeyframe == 1){ int width = 0,height = 0, fps=0; h264_decode_sps(metaData.Sps,metaData.nSpsLen,width,height,fps); // printf("width = %d\n",width); // printf("height = %d\n",height); // printf("fps = %d\n",fps); if(fps <= 0) fps = 25; tick_gap = 1000/fps; } // now = RTMP_GetTime(); // delaytime = tick_gap-now+lasttime; // printf("msleep = %d\n",delaytime); // msleep( (delaytime<0) ? 0 : delaytime); // SendH264Packet((unsigned char*)ringinfo.buffer, (unsigned int)ringinfo.size, bKeyframe, ringinfo.stamp); SendH264Packet((unsigned char*)ringinfo.buffer, (unsigned int)ringinfo.size, bKeyframe, tick); tick += tick_gap; lasttime = now + delaytime; now = RTMP_GetTime(); delaytime = tick_gap-now+lasttime ; printf("msleep = %d\n",delaytime); msleep( (delaytime<0) ? 0 : delaytime); }优化一下上面代码
时间: 2024-03-02 16:52:37 浏览: 44
h.264代码优化的一种算法
这段代码中,主要是一个无限循环,不断地从一个环形缓存中获取数据,然后将数据发送出去,同时根据获取到的数据的类型来设置一些参数,如视频的帧率等。优化方案如下:
1. 将打印调试信息的代码注释掉,避免对程序性能的影响。
2. 将获取数据和发送数据的代码分离为两个线程,这样可以使得两个操作并行执行,提高程序的并发性和性能。
3. 使用条件变量来实现线程间的同步和互斥,避免数据竞争和死锁问题。
4. 将固定的 sleep 时间改为动态计算得到的延迟时间,这样可以避免一些不必要的等待时间,提高程序的响应速度。
5. 使用宏定义或者常量来代替一些魔法数字,增加代码的可读性和可维护性。
下面是优化后的代码示例:
```
// 定义环形缓存
RingBuffer ring_buffer;
// 定义互斥锁和条件变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 定义全局变量
int width = 0, height = 0, fps = 0;
int tick_gap = 0, tick = 0;
unsigned long long last_time = 0;
// 定义获取数据线程函数
void *get_data_thread(void *arg) {
while (1) {
// 加锁
pthread_mutex_lock(&mutex);
// 如果环形缓存为空,则等待
while (ring_buffer.empty()) {
pthread_cond_wait(&cond, &mutex);
}
// 从环形缓存中获取数据
RingInfo ring_info = ring_buffer.get();
// 解锁
pthread_mutex_unlock(&mutex);
// 判断数据类型
int is_key_frame = (ring_info.frame_type == 1) ? TRUE : FALSE;
if (is_key_frame) {
h264_decode_sps(metaData.Sps, metaData.nSpsLen, width, height, fps);
if (fps <= 0) fps = DEFAULT_FPS;
tick_gap = 1000 / fps;
}
// 发送数据
SendH264Packet((unsigned char *) ring_info.buffer, (unsigned int) ring_info.size, is_key_frame, tick);
tick += tick_gap;
last_time = RTMP_GetTime();
}
}
// 定义发送数据线程函数
void *send_data_thread(void *arg) {
while (1) {
// 计算延迟时间
unsigned long long now = RTMP_GetTime();
int delay_time = tick_gap - (now - last_time);
// 如果延迟时间小于等于 0,则不等待
if (delay_time > 0) {
msleep(delay_time);
}
// 唤醒获取数据线程
pthread_cond_signal(&cond);
}
}
// 主函数
int main() {
// 初始化环形缓存
ring_buffer.init();
// 创建获取数据线程和发送数据线程
pthread_t get_data_tid, send_data_tid;
pthread_create(&get_data_tid, NULL, get_data_thread, NULL);
pthread_create(&send_data_tid, NULL, send_data_thread, NULL);
// 等待线程结束
pthread_join(get_data_tid, NULL);
pthread_join(send_data_tid, NULL);
return 0;
}
```
需要注意的是,这只是一个简单的优化方案,具体的实现方式可能因为不同的应用场景而有所不同。
阅读全文