我想写MJPEG图片互联网流查看器。我认为使用套接字获取jpeg图像不是很难的问题。但我想知道如何制作准确的流媒体。
while (1)
{
get_image()
show_image()
sleep (SOME_TIME) // how to make it accurate?
}
任何建议都很好。
最佳答案
为了准确起见,有两种可能性:
使用流服务器中的帧速率。在这种情况下,客户端需要保持相同的帧速率(每次获得帧时计算,然后使用反馈显示和睡眠一段可变的时间:如果计算出的帧速率高于服务器->睡眠更多;如果低于->睡眠更少;则客户端的帧速率将在服务器的原始值附近漂移)。它可以在流连接初始化期间(当您获得图片大小和其他参数时)从服务器接收,也可以进行配置。
实际上,最精确的方法是每帧使用来自服务器的时间戳(在相机设备的情况下,时间戳可以由解复用器从文件中获取,也可以在图像传感器驱动程序中生成)。如果MJPEG打包到RTP流中,则这些时间戳已经在RTP头中。因此,客户端的任务很简单:使用从时间偏移量、当前时间戳和时基计算的时间来显示图片。
更新
对于第一种解决方案:
time_to_sleep = time_to_sleep_base = 1/framerate;
number_of_frames = 0;
time = current_time();
while (1)
{
get_image();
show_image();
sleep (time_to_sleep);
/* update time to sleep */
number_of_frames++;
cur_time = current_time();
cur_framerate = number_of_frames/(cur_time - time);
if (cur_framerate > framerate)
time_to_sleep += alpha*time_to_sleep;
else
time_to_sleep -= alpha*time_to_sleep;
time = cur_time;
}
,其中alpha是要播放的反馈(0.1..0.5)的反应性的常数参数。
但是,最好为输入图像组织队列,以使显示过程更平滑。队列的大小可以参数化,并且可以在大约1秒的时间内显示,即在数字上等于帧速率。
关于c - MJPEG互联网流-准确的fps,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3425659/