int Recorder::add_second_part_to_encoder(int id) { //当前id不存在 直接返回 if (encoders.end() == encoders.find(id)) return -1; Encoder* encoder = encoders[id]; //得到当前解码器 //encoders.erase(id); //不能删除 否则出现内存泄漏 编码结束后才可以删除 if (NULL == encoder) { encoders.erase(id); return -1; } //如果标志位已经被设置为false则不添加数据 if (!encoder->get_is_encoding()) return -1; //将当前的视频和音频数据 加入到 编码器中去 pthread_mutex_lock(&video_queue_mutex); encoder->add_frame_to_video_que(video_que); pthread_mutex_unlock(&video_queue_mutex); pthread_mutex_lock(&audio_queue_mutex); //对音频队列进行加锁 encoder->add_frame_to_audio_que(audio_que); pthread_mutex_unlock(&audio_queue_mutex); //释放锁,供其他线程使用 //设置标志为 encoder->set_is_encoding(false); return encoder->get_id(); }
int Recorder::init_encoder(char* file_path) { //更新id encoder_id++; //初始化一个编码器 Encoder* encoder = new Encoder(encoder_id, file_path); //将当前的视频和音频数据 加入到 编码器中去 pthread_mutex_lock(&video_queue_mutex); encoder->add_frame_to_video_que(video_que); pthread_mutex_unlock(&video_queue_mutex); pthread_mutex_lock(&audio_queue_mutex); //对音频队列进行加锁 encoder->add_frame_to_audio_que(audio_que); pthread_mutex_unlock(&audio_queue_mutex); //释放锁,供其他线程使用 //将对应的编码器索引 和 编码器 添加到hash_map中 pthread_mutex_lock(&encoders_mutex); encoders.insert(make_pair(encoder->get_id(), encoder)); pthread_mutex_unlock(&encoders_mutex); //返回编码器的id return encoder->get_id(); }