gpt4 book ai didi

c - C 流媒体引擎最佳实践

转载 作者:行者123 更新时间:2023-11-30 17:25:40 25 4
gpt4 key购买 nike

语言:C/ENV:Linux

我正在开发一个流引擎,目前我可以启动、停止和暂停流,但是寻找是让我很头疼的操作,我已经在这里问了一个问题之前并修复了答案中代码内的一些问题。

使用lseek()函数,我将打开的流文件描述符作为第一个参数传递,另外我使用UDP进行传输,类似于以下代码:

transport_fd = open(tsfile, O_RDONLY);
int offset = 1024;
off_t offsetIndicator;
if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0) printf("Error seeking\n");

每当我尝试在流式传输时进行搜索时,流式传输就会停止并且图片会挂起。

有什么我应该注意的吗?,即:在查找文件后尝试 sleep()nanosleep() 以便进行更改生效。

我找不到此类引擎最佳实践的示例、论文或相关文章。

编辑:

经过测试,文件似乎继续流式传输,但网络上的接收设备不再捕获流连接,并且在减去查找时间后计算完成所需的时间,流似乎正常完成。

代码片段:

while (!completed) 
{
while (/* Comparing conditions */ && !completed)
{
if (seekLck == 1) // seekLck is a semaphore to test seek signal from father process initiated by 0
{
int offset = 1024;
off_t offsetIndicator;
if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0)
printf("Error seeking\n");
nanosleep(&nano_sleep_packet, 0); //Try to sleep to see if it is still hanging, didn't work
seekLck = 0;
}
len = read(transport_fd, send_buf, packet_size);
if(len < 0) {
fprintf(stderr, "File read error \n");
completed = 1;
}
else if (len == 0)
{
fprintf(stderr, "Sent done\n");
completed = 1;
}
else
{
sent = sendto(sockfdstr, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
if(sent <= 0)
{
perror("send(): error ");
completed = 1;
}
}
}
nanosleep(&nano_sleep_packet, 0);
}
close(transport_fd);
close(sockfdstr);
free(send_buf);
printf("cleaning up\n");
return 0;
}

最佳答案

主要问题是“为什么即使 lseek() 工作正常,文件也没有被流式传输(播放)?”...

实际上服务器端没有任何问题,但即使如此,客户端在丢失帧计数后也无法继续流式传输(流式传输 ffmpeg 帧,客户端从视频加扰器获取流)。

在这种情况下对我有用的是获取套接字参数并杀死(以干净的方式)在保持流位置的同时需要查找的进程,然后从查找位置启动一个全新的流相同的套接字参数,因此它取代了旧的。

我希望这会对人们有所帮助,尤其是没有太多关于这些东西的文档。

关于c - C 流媒体引擎最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com