【问题标题】:MJPEG internet streaming - accurate fpsMJPEG 互联网流媒体 - 准确的 fps
【发布时间】:2010-08-06 16:14:30
【问题描述】:

我想写 MJPEG 图片互联网流查看器。我认为使用套接字获取 jpeg 图像并不是很困难的问题。但我想知道如何制作准确的流媒体。

while (1)
{
     get_image()
     show_image()
     sleep (SOME_TIME) // how to make it accurate?
}  

任何建议都会很棒。

【问题讨论】:

  • 你在什么平台上运行?
  • 我用 c/c++ 编程语言在 windows 上写作。我想我会使用 opengl 进行图像输出。

标签: c mjpeg


【解决方案1】:

为了准确,有两种可能:

使用流媒体服务器的帧率。在这种情况下,客户端需要保持相同的帧率(每次获得帧时计算,然后使用反馈显示并休眠可变的时间:如果计算的帧率高于服务器 -> 睡眠更多;如果低于-> sleep less; 然后,客户端的帧率将在服务器的原始值附近漂移)。可以在流连接初始化时(获取图片大小等参数时)从服务器接收,也可以配置。

实际上,最准确的方法是使用服务器每帧的时间戳(由解复用器从文件中获取,或者在摄像头设备的情况下在图像传感器驱动程序中生成)。如果将 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 秒的时间显示,即数值上等于帧率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2014-11-10
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多