1. 程式人生 > >一種用FFmpeg直接錄屏並直播的方法

一種用FFmpeg直接錄屏並直播的方法

http://bbs.ngacn.cc/read.php?tid=7079971&rand=665

我是鬥魚14247病床的UP,現在為大家介紹使用FFmpeg直接錄屏並直播的方法。blink

1.2版附件請從這裡下載:[http://pan.baidu.com/s/1jGgd79O]

首先介紹一下我的系統環境:
System: Distro: Linux Mint 13 Maya
Desktop: MATE
Mainboard: MSI Z77IA-E51 (MS-7733)
CPU: Quad-Core Intel Core i7-3770T CPU (OC @ 4.10 GHz)
Memory: Type: Dual Channel DDR3-1866 CL10


Size: 16384 MB
Graphics: Card: NVIDIA GK106 [GeForce GTX 650 Ti]
Monitor: DELL E1913
Resolution: 1440x900@75Hz 
Network: Card-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Card-2: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Card-3: Intel Centrino Wireless-N 2230
SSD: KINGSTON SV300S37A120G

Capacity: 120 GB
HDD: ST2000VM003-1CT164
Capacity: 2.0 TB

使用的FFmpeg是ppa:jon-severinsson/ffmpeg上的0.10版本。Ubuntu/Debian官方源裡的FFmpeg目前是Libav的過渡包,不建議使用。
附件中包括了自己編寫的錄屏的bash指令碼以及鬥魚彈幕助手的Linux啟動器(需要自行安裝JRE),以及一些資原始檔(例如金坷垃 精神汙染 水印圖片),不能直接使用,尤其是Windows使用者。擦汗

settings.txt是用來配置鬥魚推流地址的。broadcast_lq.sh和broadcast_hq.sh分別是低/高位元速率的直播和錄影。注意樓主使用的是MATE桌面環境,所以請自行修改使用的虛擬tty終端程式。

lib/lq.sh和lib/hq.sh是真正負責錄影的指令碼。錄影和推流的引數在裡面。

下面以更加常用的低位元速率為例介紹ffmpeg的引數。引數是簡化了的,只能錄影不能推流。
Windows使用者請先閱讀[http://trac.ffmpeg.org/wiki/How%20to%20grab%20the%20desktop%20(screen)%20with%20FFmpeg]。安裝合適的DirectShow裝置,修改Linux依賴的對應行(主要是第二行和第三行)就可以了。
ffmpeg -y -loglevel info \ # 忽略檔案覆蓋提示,日誌輸出級別為“資訊”。
-f x11grab -framerate 25 -r 25 -s 1440x810 -i :0.0+0,45 -vsync vfr \ # 視訊捕捉裝置是x11grab(註釋0),捕捉速率25幀每秒,視訊幀率25幀每秒,視訊原始解析度1440x810,裁剪掉上面和下面各45畫素高度區域,視訊同步方式為時間碼。
-f alsa -ar 44100 -ac 2 -cutoff 12000 -i pulse -async 20 \ # 音訊捕捉裝置是alsa(註釋0),頻率是44100Hz,立體聲,低通濾波為12000Hz,使用pulseaudio方法,音訊同步取樣為20塊每秒。
-vf "scale=1280:720[scaled]; movie=watermark.png[watermark]; [scaled][watermark] overlay=0:0" \ # 縮放視訊尺寸為720p,新增全屏水印(水印本身是透明塗層)。
-vcodec libx264 -r 25 -pix_fmt yuv420p -preset medium -profile:v high \ # 視訊編碼器是libx264(即H.264輸出),輸出幀率25幀每秒,色彩編碼是yuv420p,編碼器預設為平衡速度和質量(註釋1),編碼器複雜度等級為高(註釋2)。
-level 5.1 -crf 28 -maxrate 1500k -bufsize 1500k -refs 4 -qmin 4 \ # 視訊編碼器位元速率等級為5.1(最高)(註釋3),恆定質量級別為28(註釋4),最大位元速率為1500Kbps(鬥魚推薦值),並設定等大的編碼緩衝區,調節Mac OS X系統解碼器相容性引數。
-x264opts bluray_compat=1:open_gop=1 -vsync cfr \ # 啟用藍光相容(改善與硬體解碼的相容性),啟用開放式幀組(大幅降低靜態畫面的位元速率),視訊同步方式為掉幀/插幀。
-acodec libmp3lame -ar 44100 -aq 6 -compression_level 0 -async 20 \ # 音訊編碼器是libmp3lame(即MP3輸出),頻率44100Hz,變位元速率質量等級為6(註釋5),聽覺心理學模型全部啟用(註釋6),音訊同步取樣為20塊每秒。
-f flv -movflags +faststart "record.flv" # 封裝格式為FLV(註釋7),並啟用瀏覽器快速載入,檔名為record.flv(含路徑)。

註釋:
0:Windows使用者請先閱讀[http://trac.ffmpeg.org/wiki/How%20to%20grab%20the%20desktop%20(screen)%20with%20FFmpeg]
1:電腦配置差一點/不少的話請設定preset為fast,veryfast。這會加大視訊位元速率。
2:如果想讓非常舊的iPhone 4S也能看視訊,請設定profile:v為main。
3:如果想讓非常舊的iPhone 4S也能看視訊,請設定level為4.0。
4:像23-28之間的crf值都比較合理(越低質量越好),直播的話還是要考慮一下觀看直播的長城寬頻使用者的感受。
5:像2-6這樣的aq值都比較合理(越低質量越好)。如果設定aq為2-4範圍的話可以把第三行的低通濾波引數修改為16000Hz。
6:電腦配置差很多的話compression_level改為3。這樣做對質量影響不大,能提高不少編碼速度。
7:若使用MP4封裝,則最後一行為-f mp4 "record.mp4"。MP4不支援瀏覽器快速載入。

http://bbs.ngacn.cc/read.php?&tid=7079971