最近同事在用EasyAVFilter集成在EasyDarwin中做視頻拉流轉推RTMP流的功能的時候,發現怎么做CPU占用都會很高,但是視頻沒有調用轉碼,vcodec用的就是copy,這是什么原因呢?
我們用在線的RTSP流就不會出現這種情況!
思考一下,我們發現,原來是因為當ffmpeg如果是讀取視頻文件流的時候,如果源端(比如文件或者http下載文件)沒有流控,就是一股腦請求到一堆數據來的時候,發送是發送不完的,但是請求幾乎是瞬間就把數據拉到了緩沖區,再加上-stream_loop -1的選項,源源不斷的數據就洪水而至,導致發送根本忙不過來,結果CPU就增加了,于是,我們加了一個 -re 參數,有序地讀取網絡流或者文件流,這樣就能解決好這種源數據沒有流控的情況了,看圖:
這里還有一個現象,當 -re 參數放錯了位置,比如放到了-i xxx.mp4后面了,就會報:
Error parsing options for output file rtmp://127.0.0.1:10035/live/IdHBMRNIR?sign=IdHfagHSgz Error
opening output files: Invalid argument
所以-re要放到最前面!