rv1106_ipc例程中录制视频的时长错误
Posted: 2024-05-30 3:03
你好,我在rv1106_ipc的基础上做二次开发,主要功能是录制视频生成.mp4文件。
我需要在特定时刻触发视频录制功能,而原有的例程是在.ini文件中固定录制时长duration.
虽然修改代码后也能在特定时刻生成.mp4文件,但是由于信号量rk_storage_muxer_group[id].g_storage_signal没有获取,录制视频流异常结束导致文件时长错误,录制了15分钟但文件信息只有2秒。 storage.c中修改的函数如下:
结合开发手册的结构框图,所涉及的部分用红圈全出。
在修改storage.c代码过程中多次看到程序使用muxer复用器相关功能,但是却没有找到#include "rkmuxer.h"这个头文件的位置,麻烦告知下。
想找到复用器muxer生成.mp4部分的源码,排查问题,或者您有别的解决方式。
我需要在特定时刻触发视频录制功能,而原有的例程是在.ini文件中固定录制时长duration.
虽然修改代码后也能在特定时刻生成.mp4文件,但是由于信号量rk_storage_muxer_group[id].g_storage_signal没有获取,录制视频流异常结束导致文件时长错误,录制了15分钟但文件信息只有2秒。 storage.c中修改的函数如下:
Code: Select all
//每小时0,15,30,45分钟触发录制
static void *rk_storage_record(void *arg) {
int *id_ptr = arg;
int id = *id_ptr;
printf("id: %d, #Start %s thread, arg:%p\n", id, __func__, arg);
//设置进程名 rk_storage_record
prctl(PR_SET_NAME, "rk_storage_record", 0, 0, 0);
// 如果开启存储
while (g_storage_record_flag[id] && record_flag[id] == 1) {
//获取当前时间
time_t t = time(NULL);
struct tm tm = *localtime(&t);
//生成文件名
snprintf(rk_storage_muxer_group[id].file_name, 512, "%s/%d%02d%02d%02d%02d%02d.%s",
rk_storage_muxer_group[id].record_path, tm.tm_year + 1900, tm.tm_mon + 1,
tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
rk_storage_muxer_group[id].file_format);
// 打印文件名
LOG_INFO("[%d], file_name is %s\n", id, rk_storage_muxer_group[id].file_name);
// 互斥锁
pthread_mutex_lock(&g_rkmuxer_mutex);
// 停止旧的muxer
rk_storage_muxer_group[0].g_record_run_ = 0;
rkmuxer_deinit(id);
// 开始新的录制(文件名、视频帧、音频帧)
rkmuxer_init(id, NULL, rk_storage_muxer_group[id].file_name,
&rk_storage_muxer_group[id].g_video_param,
&rk_storage_muxer_group[id].g_audio_param);
rk_storage_muxer_group[0].g_record_run_ = 1;
pthread_mutex_unlock(&g_rkmuxer_mutex);
// 等待 file_duration
// rk_signal_wait(rk_storage_muxer_group[id].g_storage_signal,
// rk_storage_muxer_group[id].file_duration * 1000);
// 等待直到下一个触发点(0, 15, 30, 45分钟)
int next_minute = (tm.tm_min / 15 + 1) * 15;
if (next_minute >= 60) {
next_minute = 0;
tm.tm_hour += 1;
}
tm.tm_min = next_minute;
tm.tm_sec = 0;
time_t next_trigger_time = mktime(&tm);
time_t current_time;
do {
current_time = time(NULL);
sleep(1);
} while (current_time < next_trigger_time);
}
pthread_mutex_lock(&g_rkmuxer_mutex);
rk_storage_muxer_group[0].g_record_run_ = 0;
rkmuxer_deinit(id);
pthread_mutex_unlock(&g_rkmuxer_mutex);
return NULL;
}
想找到复用器muxer生成.mp4部分的源码,排查问题,或者您有别的解决方式。