in sample/video_frame_producer_sample.c [103:190]
void post_frame(log_producer_client * client, video_frame * frame)
{
if (client == NULL || frame == NULL)
{
return;
}
// 帧数据封装 start
char * g_frame_keys[] = {
(char *)"duration",
(char *)"frame_data",
(char *)"frame_flag",
(char *)"decoding_timestamp",
(char *)"presentation_timestamp",
(char *)"extra_info"
};
size_t g_frame_keys_len[] = {
strlen("duration"),
strlen("frame_data"),
strlen("frame_flag"),
strlen("decoding_timestamp"),
strlen("presentation_timestamp"),
strlen("extra_info")
};
char * values[6];
char duration[32];
sprintf(duration, "%llu", (long long unsigned int)frame->duration);
char frame_flag[32];
sprintf(frame_flag, "%u", frame->frame_flag);
char decoding_timestamp[32];
sprintf(decoding_timestamp, "%llu", (long long unsigned int)frame->decoding_timestamp);
char presentation_timestamp[32];
sprintf(presentation_timestamp, "%llu", (long long unsigned int)frame->presentation_timestamp);
values[0] = duration;
values[1] = (char *)frame->frame_data;
values[2] = frame_flag;
values[3] = decoding_timestamp;
values[4] = presentation_timestamp;
values[5] = (char *)frame->extra_info;
size_t values_len[] = {
strlen(duration),
frame->frame_data_size,
strlen(frame_flag),
strlen(decoding_timestamp),
strlen(presentation_timestamp),
frame->extra_info_size
};
// 帧数据封装 end
// 调用producer接口发送数据
log_producer_result rst = log_producer_client_add_log_with_len(client, 6, g_frame_keys, g_frame_keys_len, values, values_len);
// 异常处理
if (rst != LOG_PRODUCER_OK)
{
// 这边可以加入一些异常处理,如果是关键帧发送失败,可以每隔10ms重试一次,超过10次继续失败时再丢弃
if ((frame->frame_flag & FRAME_FLAG_KEY_FRAME) != 0)
{
int try_time = 0;
for (; try_time < 10; ++try_time)
{
usleep(10000);
if (log_producer_client_add_log_with_len(client, 6, g_frame_keys, g_frame_keys_len, values, values_len) == LOG_PRODUCER_OK)
{
break;
}
}
if (try_time == 10)
{
printf("add key frame error %d \n", rst);
}
}
else
{
printf("add normal frame error %d \n", rst);
}
}
}