2016年11月23日 星期三

使用 Yotubue 進行影像串流直播

本篇記錄透過 youtube 進行影像串流直播的過程。

1. 下載 wirecast go app


2. 選擇錄影鍵,此時會要求你登入 youtube帳號,



3. 下圖中選擇 "Albert Liao 即時串流",接著會再回到步驟一的畫面,按下錄影便開始直播了。

4. 接著會回到 step 2的畫面,此時按下紅色錄影鍵便開始直播了。
5. 使用瀏覽器打開Youtube 網頁,選擇 [即時串流] -> [立即直播]就可以看到直播的畫面了。




Wirecast 挺容易使用,但是延遲約 6~8 秒,是真的有點慢,並且其他功能都要付費。也許付費之後,影像延遲會較少。

2016年11月9日 星期三

epoll 介紹

最近把 C10K 問題重新溫習一遍,針對裡面提到的幾個技術,有些時間好好看一下。第一個注意到的就是 linux 系統下的 epoll。

epoll 與 select 的差異

  • select() 有個問題,其最大個數限制 FD_SETSIZE,預設值可能是 1024 或 2048
  • epoll 上限是系統最大可以打開文件的數目,執行 "cat /proc/sys/fs/file-max" 可檢視此上限值。在 Linux 2.6.28之後,要檢視 /proc/sys/fs/epoll/max_user_watches 
  • 另外 epoll 透用 mmap 讓 kernel space 與 user space 共享同一塊內存,減少內存拷貝。而 select() 則需要較多的內存拷貝。

epoll 支援兩種工作模式
LT(level triggered)
支援 block 和 no-block socket,在事件狀態未變更前將不斷被觸發。(直到緩衝區資料全部被讀取)
ET(edge-triggered)
僅支援 no-block socket,在事件狀態改變時只觸發一次。

三個API
int epoll_create(int maxfds);
建立 epoll 文件描述符 
int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event);
增刪或修改文件描述符,這些描述符的集合又稱為 epoll set。
op 可以是 EPOLL_CTL_ADD, EPOLL_CTL_DEL, EPOLL_CTL_MOD 
epoll_event 結構如下:
struct epoll_event
{
  uint32_t events; /* Epoll events */
  epoll_data_t data; /* User data variable */
}; 
新增 event 時要設定事件以及文件描述符,如下: 
setnonblocking(fd);
ev.events=EPOLLIN|EPOLLET;
ev.data.fd=fd; 
// EPOLLET:工作模式設定為 edge-triggered,若不設定則是 level triggered
// EPOLLONESHOT: 一個事件發生並且讀取之後,不再監聽此文件描述符
// EPOLLIN是監聽讀的事件,若需要監聽寫的事件,可加入EPOLLOUT
int epoll_wait(int epfd, epoll_event *events, int max events, int timeout)
等待用戶感興趣的 IO事件發生, 若有事件發生會返回事件個數,並將事件放入 events。若要關閉 epoll 文件描述符, 直接使用 close() 即可。

程式範例
epollfd = epoll_create1(0);

event.events = EPOLLIN;
event.data.fd = serverfd;
epoll_ctl(epollfd, EPOLL_CTL_ADD, serverfd, &event);

while(true) {
 nfds  = epoll_wait(epollfd, &events, MAXEVENTS, timeout);
 for(i = 0; i < nfds; ++i) {
  if(events[i].data.fd == serverfd) {
   conn_sock = accpet(listen_sock,(struct sockaddr *) &addr, &addrlen);
   setnonblocking(conn_sock);                       
   
   ev.events = EPOLLIN | EPOLLET;
            ev.data.fd = conn_sock;
            if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev) == -1) {
    perror("epoll_ctl: conn_sock");
    exit(EXIT_FAILURE);
   }
   
  } else {
   do_use_fd(events[n].data.fd);
  }
 }
}


參考資料

iNotify 筆記

iNotify 可用來監控目錄或是檔案變化,包含 read/write/add/delete 等等,Linux 2.6.13 之後導入此機制。可以用來判斷是否有人將惡意軟體下載到某個目錄(例如:mirai),或是與rsync結合,當作 Linux 系統的檔案同步機制。

此篇記錄此函數的使用方法。

iNotify 共提供三個 API
  • int inotify_init(void)
  • int inotify_add_watch(int fd, const char* pathname, int mask)
  • int inotify_rm_watch(int fd, int wd)
inotify_init() 初始化完成後,可得到一個file descriptor。
該descriptor 可經由 read()、select()、epoll來操作,與多數的file descriptor無異,同時支援blocking、non-blocking IO。
當有任何事件觸發時,系統會將事件寫入在 inotify_event 結構中,供使用者存取
struct inotify_event {
int      wd;       /* Watch descriptor */
uint32_t mask;     /* Mask of events */
uint32_t cookie;   /* Unique cookie associating related events */
uint32_t len;      /* Size of name field */
char     name[];   /* Optional null-terminated name */
};

程式範例
#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int fd, wd, length, i = 0;
char buffer[BUF_LEN];

fd = inotify_init();
wd = inotify_add_watch( fd, "/home/strike", 
      IN_MODIFY | IN_CREATE | IN_DELETE );
length = read( fd, buffer, BUF_LEN );  // blocked before event occurs
while ( i < length ) {
 struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
 if ( event->len ) {
  if ( event->mask & IN_CREATE ) { // created
  }
  else if ( event->mask & IN_DELETE ) { // deleted
  }
  else if ( event->mask & IN_MODIFY ) { // modified
  }
 }
 i += EVENT_SIZE + event->len;
}

inotify_rm_watch( fd, wd );
close( fd );


參考資料:
  1. http://www.ibm.com/developerworks/cn/linux/l-ubuntu-inotify/
  2. http://man7.org/linux/man-pages/man7/inotify.7.html

live555 -- wis-streamer 與 media-server 的抉擇

當我們要實作一個 streaming server 時,該參考哪個範例較適合呢? Live555 提供了許多程式範例,以下將簡介各個測試程式,以了解何時該採用哪個範例。

2016年11月6日 星期日

Mirai程式碼分析

Mirai程式碼分析

Mirai 是一網路殭屍病毒,名稱可能是取自日文「未来」,最近作者Anna-senpai開放原始碼,正好可以一窺殭屍病毒作法。本篇針對其程式流程做一介紹,希望在開發自家產品時,能夠避開這些攻擊方法,避免成為殭屍大軍一員。