利用node.js搭建简易DASH直播系统

一、直播系统搭建

本文主要利用GPAC推出的MPEG DASH直播切片软件Dashcast、node.js、以及播放器MP4Client进行直播系统的搭建。

  1. DashCast -vf dshow -vres 640x480 -vfr 30 -v video=”screen-capture-recorder” -live -low-delay -frag 200 -insert-utc -seg-marker eods -min-buffer 0.2 -ast-offset -800 -pixf yuv420p
  2. node dash.js -segment-marker eods -chunk-media-segments
  3. MP4Client http://127.0.0.1:8000/output/dashcast.mpd -opt Network:BufferLength=200 -opt DASH:LowLatency=chunk -opt DASH:UseServerUTC=no

二、node.js

  • http.createServer:该函数用来创建一个HTTP服务器,并将requestListener作为request时间的监听函数。http.createServer([requestListener])
    接收参数:
    requestListener:请求处理函数,自动添加到request事件,函数传递两次参数;
    req:请求对象,想知道req有哪些属性,可以查看“http.request属相整合”;
    res:响应对象,收到请求后要做出的响应。
  • http.response.setHeader:设置头文件信息。如果将要发送的信息已包含头文件,执行该方法后头文件的值将被改写。如果一个头文件需要传递多个值,可以使用数组。response.setHeader(name, value)
    name:响应头的类型,注意这个名字是不区分大小写
    value:响应头的值
  • fs.readSync:同步版的 fs.read() 。方法将返回一个 bytesRead (读取的字节数)fs.readSync(fd, buffer, offset, length, position)
    buffer:缓冲区,数据将被写入
    offset:buffer写入的偏移量
    length:(integer)指定文件读取字节数长度
    position:(integer)指定文件读取的起始位置,如果该项为null,将从当前文件指针的位置开始读取数据

三、dash.js解读

  • reportEvent:由于MP4Box和DashCast的时移删除特性,程序需要检查文件是否还存在
  • sendAndUpdateBuffer:发送并更新缓存中的数据
  • onRequest:首先检查所请求的文件的后缀名,然后检查是否存在,notFound的话打印错误信息。若请求文件的后缀名为mpd或者mp4或者m4s,设置头文件信息。然后检查是否我们应该以fragmented files的形式发送MP4文件。若是,则要设置各项参数,然后执行sendFragmentedFile函数。
  • sendFragmentedFile:如果在文件中有一些数据需要读取,那就进行读取(从next_file_postion位置)到buffer中(在write_offset位置)(调用readFileIntoBuffer)。然后读取boxes并发送,要确保有至少8个bytes去读取box长度和box code,否则需要等待下一次读取(调用readFromBufferAndSendBoxes)。然后判断next_file_position与file_size的大小关系,来分析是否还有数据需要读取。如果没有了,判断boxReadingStatus的状态: ok即需要继续读取,not-enough需要等待另一个文件,stop重置分析器,MP4Box写在文件中的数据没有准备好,end表示文件已经读取完毕。然后进行标记,保证文件内容更新后可以发送。

  • readFileIntoBuffer:如果buffer长度不够,先增加buffer的大小,然后利用readSync读取数据到buffer中

  • readFromBufferAndSendBoxes:其中有部分判断是否是segment_marker的部分,如果是,那么参数endOfSegmentFound改为true。然后判断是none、moov、moof、mdat中的哪种。

你可能感兴趣的:(DASH)