zoukankan      html  css  js  c++  java
  • live555 media server文件播放与读内存播放

    live555提供的示例程序mediaServer是一个基于文件播放的rtsp server。
    有朋友问如果改造成一个实时的视频流。

    从代码可以看出,当收到rtsp 的命令时,会执行DynamicRTSPServer::lookupServerMediaSession()。
    session不存在时,会createNewSMS生成一个新的。
    在createNewSMS中会调用 sms->addSubsession(AMRAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource));
    (假设我们的视频源是mpeg4-es)
    再跟踪代码,发现createNew是给变量fFileName赋值,把文件名保存起来。

    再下去,就是rtsp的播放准备播放命令了,很明显,需要一个视频源,这时程序会调用MPEG4VideoFileServerMediaSubsession::createNewStreamSource
    在这里ByteStreamFileSource::createNew(envir(), fFileName);

    接下去就简单了,每次doGetNextFrame,会fread,当然,如果异步的话,会交给TaskScheduler去做:
    void ByteStreamFileSource::doGetNextFrame() {
      if (feof(fFid) || ferror(fFid)) {
        handleClosure(this);
        return;
      }

    #ifdef READ_FROM_FILES_SYNCHRONOUSLY
      doReadFromFile();
    #else
      if (!fHaveStartedReading) {
        // Await readable data from the file:
        envir().taskScheduler().turnOnBackgroundReadHandling(fileno(fFid),
               (TaskScheduler::BackgroundHandlerProc*)&fileReadableHandler, this);
        fHaveStartedReading = True;
      }
    #endif
    }

    //**************
    以上是读文件的方式。如果换成实时视频流,有两种方案:一是参考spook,读v4l2驱动得视频数据,读数据后就发送。另一种方法,是从内存中读到视频数据(来源可能是文件,也可能从远程通过socket得到,也可以从驱动读出,得到数据放到内存中)。如果对live Media Server做最小改动的话,就是参考ByteStreamFileSource,再写一个Source。
    当然,想偷懒的话也简单:doReadFromFile时,从fread读文件,改成读内存缓冲就行了。注意一定要加锁。

    以上只是理论,等放长假找个时间写出来试试。

  • 相关阅读:
    Atmel Studio 烧录 Atmega328P(Arduiono)
    JSP内置对象详解及示例
    Hash Map 详细解释及示例
    19年双非学长逆袭985考研经验贴
    camelCase命名规范
    开始我的编程之旅!
    【转】堆和栈的区别
    现场编写类似strstr/strcpy函数
    【转】C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable
    【转】TCP协议中的三次握手和四次挥手(图解)
  • 原文地址:https://www.cnblogs.com/moonvan/p/2174602.html
Copyright © 2011-2022 走看看