上一次我們知道如何使用 raspistill
以及 raspivid
來實現影像串流。現在我要來嘗試如何在 Raspberry Pi 上實現 HLS stream。
在正式開始之前,先來看一下 HLS (HTTP Live Streaming) 吧,HLS 是蘋果公司推出的一款基於 HTTP 協定的影音串流協定,其檔案格式在 Video 端是以 H.264 編碼,在 Audio 方面則是以 MP3, HE-AAC 或 AC-3 格式編碼。也因為如此,所以我們必須把從 Camear 取得的影音資料打包成 HLS 格式,所幸 FFmpeg 已經提供了這部分的功能。
Build Library
FFmpeg 是一個自由軟體,可以執行 Audio, Video 多種格式的錄影、轉檔及串流功能,其中分成幾個組件 (ex. ffmpeg, ffplayer, ffserver),這些組件也會使用像 libavcodec (audio, video codec), libavformat (audio, video converter) 等函式庫,FFmpeg 同時也可以使用外部函式庫來加強對於音視頻編碼的支援廣度。我們待會也會一併把 x264, faac, lame 編入 ffmpeg 中。
Build x264 (H264 encoder)
1 | git clone git://git.videolan.org/x264 |
Build faac (AAC encoder)
1 | wget http://downloads/sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz |
Build lame (MP3 encoder)
1 | wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.tar.gz |
Build FFmpeg
1 | git clone git://source.ffmpeg.org/ffmpeg.git |
由於我們用到了 x264,因此在編譯 FFMpeg 時必須選用 GPL license。另外一提,在編譯 FFmpeg 其實是很花時間的工作,讓我們喝杯咖啡休息一下吧…
喝完咖啡,又睡了個午覺後,所有的 Library 終於都已經就位了 (/usr/local),這時候趕緊來試一下 ffmpeg 吧…咦?為什麼會發生錯誤?
1 | ffmpeg: error while loading shared libraries: libavdevice.so.56: cannot open shared object file: No such file or directory |
原來是 ffmpeg 會用到的函式庫 (ex. libavcodec) 所在目錄不在 library search path 裡,因此才會無法執行,這時候可以透過下述二種方式擇一進行:
Solution 1:
1 | export LD_LIBRARY_PATH=/usr/local/lib |
Solution 2:
1 | LD_LIBRARY_PATH=/usr/local/lib ffmpeg |
重新再執行一次,耶!成功了!
1 | ffmpeg version N-72416-gc7bd6a5 Copyright (c) 2000-2015 the FFmpeg developers |
Setting up the streaming server
為了能讓外部連線進來,我們先使用 python 啟用一個 http service。
1 | python -m SimpleHTTPServer & |
接著我們使用 raspvid
來產生我們需要的 video stream data。
1 | rm -rf live* |
我們使用 mkfifo
透過 named pipe 方式讓 FFmpeg 讀取由 raspivid 輸出的 streaming data。
1 | LD_LIBRARY_PATH=/usr/local/lib ffmpeg -y \\ |
由於我手上的 Raspberry Pi 沒有接麥克風,所以我拿掉了 audio 部分。
好了,現在執行 VLC 打開網址 http://{the_ip}:8000/live.m3u8
在完成 Video streaming server 端的設定後,我們要使用 Android 上的 VideoView 控件來實現 HLS 影像播放。
目前 Google 正在力推 Android Studio 作為 Android 開發的主要編輯器,我們就下載這套編輯器來使用吧。
截至目前最新版本是 v.1.2.1.1,功能已經相當完整,距 2013 年 Google I/O 剛發表 v0.1 版本時,其整合的功能可說是天壤之別。
在成功安裝設定完成後,我們新建一個專案 “RPiPlayer”。
選擇 SDK 版本,我個人習慣是選擇 Android 4.1 (Jelly Bean)。
我們選擇一個空白的 Activity。
保持預設的 Activity name。
好了,讓我們寫一些代碼吧。
由於需要賦予 APP 有存取網路的權限,我們打開 AndroidManifest.xml
加入:
1 | ... |
然後再開啟 activity_main.xml
,修改成:
1 | <RelativeLayout |
完成後,從 Android Studio 上可以看到 APP 的 Layout
最後我們來編輯 Activity 程式碼:
1 | @Override |
然後,開啟模擬器或是接上你的手機來試試,在 APP 上的 EditText 內輸入 HLS 的網址,按下 GO 按鈕。
耶!看到影像了!
經過這個系列的文章,我們學會了如何使用 Raspberry Pi 以及 Raspberry Pi Camera module 來獲取圖片、錄影,以及輸出成 RTSP、HLS 等串流影像。
我們也製作了一個簡單的 Android APP 來觀看 HLS 串流影像。