feat: 视频帧后增加时间戳
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
@@ -56,7 +57,7 @@ typedef struct
|
||||
} VideoSender;
|
||||
|
||||
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);
|
||||
|
||||
typedef struct
|
||||
@@ -72,6 +73,13 @@ double get_time_ms()
|
||||
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)
|
||||
{
|
||||
const char *value = getenv(name);
|
||||
@@ -127,18 +135,41 @@ static int video_sender_init(VideoSender *sender)
|
||||
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)
|
||||
{
|
||||
errno = EINVAL;
|
||||
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, ×tamp, sizeof(timestamp));
|
||||
|
||||
rc = kcp_client_send_binary(
|
||||
sender->client,
|
||||
sender->target_peer,
|
||||
encoded_pkt->data,
|
||||
(size_t)encoded_pkt->size);
|
||||
senddata,
|
||||
payload_len);
|
||||
free(senddata);
|
||||
return rc;
|
||||
}
|
||||
|
||||
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("------|---------|--------|-------|--------|-------|------|--------\n");
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
for (int i = 0; i < 10000; i++)
|
||||
{
|
||||
// 只有在开启 DEBUG_TIMING 时才声明这些时间变量
|
||||
#ifdef DEBUG_TIMING
|
||||
@@ -605,8 +636,12 @@ int main()
|
||||
// 如果不开启宏,也打印一些基本信息
|
||||
printf("Frame %d processed\n", i + 1);
|
||||
#endif
|
||||
|
||||
if (encoded_pkt && video_sender_send_packet(&sender, encoded_pkt) != 0)
|
||||
int64_t unixtime_ms;
|
||||
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");
|
||||
av_frame_free(&decoded_frame);
|
||||
|
||||
Reference in New Issue
Block a user