feat: 视频帧后增加时间戳

This commit is contained in:
2026-04-02 15:56:33 +08:00
parent b780d2e1cf
commit 21e7c17aff

View File

@@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdint.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
@@ -56,7 +57,7 @@ typedef struct
} VideoSender; } VideoSender;
static int video_sender_init(VideoSender *sender); static int video_sender_init(VideoSender *sender);
static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt); static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt, uint64_t timestamp);
static void video_sender_close(VideoSender *sender); static void video_sender_close(VideoSender *sender);
typedef struct typedef struct
@@ -72,6 +73,13 @@ double get_time_ms()
return ts.tv_sec * 1000.0 + ts.tv_nsec / 1000000.0; return ts.tv_sec * 1000.0 + ts.tv_nsec / 1000000.0;
} }
int64_t get_realtime_ms()
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
return (int64_t)ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}
static const char *env_or_default(const char *name, const char *fallback) static const char *env_or_default(const char *name, const char *fallback)
{ {
const char *value = getenv(name); const char *value = getenv(name);
@@ -127,18 +135,41 @@ static int video_sender_init(VideoSender *sender)
return 0; return 0;
} }
static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt) static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt, uint64_t timestamp)
{ {
uint8_t *senddata;
size_t payload_len;
int rc;
if (sender == NULL || sender->client == NULL || encoded_pkt == NULL) if (sender == NULL || sender->client == NULL || encoded_pkt == NULL)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
return kcp_client_send_binary( if (encoded_pkt->size < 0)
{
errno = EINVAL;
return -1;
}
payload_len = (size_t)encoded_pkt->size + sizeof(timestamp);
senddata = (uint8_t *)malloc(payload_len);
if (senddata == NULL)
{
errno = ENOMEM;
return -1;
}
memcpy(senddata, encoded_pkt->data, (size_t)encoded_pkt->size);
memcpy(senddata + encoded_pkt->size, &timestamp, sizeof(timestamp));
rc = kcp_client_send_binary(
sender->client, sender->client,
sender->target_peer, sender->target_peer,
encoded_pkt->data, senddata,
(size_t)encoded_pkt->size); payload_len);
free(senddata);
return rc;
} }
static void video_sender_close(VideoSender *sender) static void video_sender_close(VideoSender *sender)
@@ -478,7 +509,7 @@ int main()
PRINT_TIME("Frame | Capture | Decode | Scale | Encode | Total | Size | Marker\n"); PRINT_TIME("Frame | Capture | Decode | Scale | Encode | Total | Size | Marker\n");
PRINT_TIME("------|---------|--------|-------|--------|-------|------|--------\n"); PRINT_TIME("------|---------|--------|-------|--------|-------|------|--------\n");
for (int i = 0; i < 100; i++) for (int i = 0; i < 10000; i++)
{ {
// 只有在开启 DEBUG_TIMING 时才声明这些时间变量 // 只有在开启 DEBUG_TIMING 时才声明这些时间变量
#ifdef DEBUG_TIMING #ifdef DEBUG_TIMING
@@ -605,8 +636,12 @@ int main()
// 如果不开启宏,也打印一些基本信息 // 如果不开启宏,也打印一些基本信息
printf("Frame %d processed\n", i + 1); printf("Frame %d processed\n", i + 1);
#endif #endif
int64_t unixtime_ms;
if (encoded_pkt && video_sender_send_packet(&sender, encoded_pkt) != 0) if (encoded_pkt)
{
unixtime_ms = get_realtime_ms();
}
if (encoded_pkt && video_sender_send_packet(&sender, encoded_pkt, unixtime_ms) != 0)
{ {
perror("video_sender_send_packet"); perror("video_sender_send_packet");
av_frame_free(&decoded_frame); av_frame_free(&decoded_frame);