服務近2000家企業,依托一系列實踐中打磨過的技術和產品,根據企業的具體業務問題和需求,針對性的提供各行業大數據解決方案。
視頻直播軟件的技術實現方式(jwplayer+ffmpeg+red5)
來源:未知 時間:2021-34-19 瀏覽次數:248次
視頻直播目前非?;鸨鞣N視頻直播軟件,手機APP層出不窮,深受分頭的青睞。視頻直播技術基于RTMP及時流協議,點播技術基于HTTP協議,RTMP協議是Real Time Message Protocol(實時信息傳輸協議)的縮寫,它是由Adobe公司提出的一種應用層的協議,用來解決多媒體數據傳輸流的多路復用(Multiplexing)和分包(packetizing)的問題。隨著VR技術的發展,視頻直播等領域逐漸活躍起來,RTMP作為業內廣泛使用的協議也重新被相關開發者重視起來。一、centos系統搭建RED5流媒體服務器
- 安裝java運行環境jdk
- 下載red5
選擇red5-server-1.0.6-RELEASE-server.tar.gz,解壓到 /usr/local/red5
- 設置權限與安裝
cd /usr/local/red5
chmod +x *.sh
./red5.sh
./red5.sh
- red5服務器配置 :修改conf下的red5.properties可以修改IP和端口,HTTP是打開Red5的Demo頁面用的,RTMP是用于在直播,視頻播放等流服務時候使用的協議。
- 端口等其他設置:打開5080、1935等端口,配置完成后,雙擊Red5目錄下的red5.bat即可啟動Red5服務器。啟動完成后,輸入http://192.168.7.96:5080,出現畫面則表示成功。(如果不改配置文件,用http://localhost:5080即可)
三、客戶端FFmpeg的安裝及使用
服務端:red5服務器啟動,啥也不用動,最多下載個oflaDemo看看點播的效果。
客戶端:jwplayer通過rtmp協議讀取實時流。代碼如下:
jwplayer("jwplayer_flv").setup({
file: "rtmp://192.168.1.29/oflaDemo//hello",
flashplayer: '${ctx}/resource/yulan/jwplayer.flash.swf',
image : '',
primary : 'flash',
width : '800',
height : '600',
autostart: true,
mute: false,
repeat: false
});
file: "rtmp://192.168.1.29/oflaDemo//hello" 這句話可以暫時不用管,看到后面就會知道啥意思。
流的推送:ffmpeg
推送命令:
ffmpeg -i "rtsp://admin:admin123@192.168.10.91:554/h264/ch1/main/av_stream" -b 4096k -f flv -r 25 -s1280x720 -an"rtmp://localhost/oflaDemo/hello"
這句話如何在Java代碼里實現呢?網上很多。
java代碼(下面的代碼是同事給的,畢竟代碼跑過一段時間,應該沒啥問題):
public void liveVideo() throws Exception {
String rtspVideo = "rtsp://admin:admin123@192.168.10.91:554/h264/ch1/main/av_stream";
String rtmpVideo = "rtmp://192.168.1.29/oflaDemo/hello";
String commend = FFMPEG+"ffmpeg -i " + """ + rtspVideo + "" -b 4096k -f flv -r 25 -s 1280x720 -an " + """ + rtmpVideo + """;
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(commend);
StreamGobbler sg1 = new StreamGobbler(proc.getInputStream(), "Console");
StreamGobbler sg2 = new StreamGobbler(proc.getErrorStream(), "Error");
sg1.start();
sg2.start();
proc.waitFor();
proc.destroy();
}
public class StreamGobbler extends Thread {
InputStream is;
String type;
private Logger log = Logger.getLogger(this.getClass());
private static int i = 1;
private static int j = 1;
public StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
public StreamGobbler() {
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
i++;
j++;
String line = null;
while ((line = br.readLine()) != null) {
if (type.equals("Error")) {
// log.error(line);
// System.err.println(line);
}else{
// log.info(line);
// System.out.println(line);
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
從代碼可以看出,客戶端的“file: "rtmp://192.168.1.29/oflaDemo//hello" 這段代碼 和 java中"String rtmpVideo = "rtmp://192.168.1.29/oflaDemo/hello";" 這段代碼就對應起來了。
不得不說,ffmpeg這個東西的確厲害。給實現直播功能省了不少事。
至此,一個直播功能就實現了。

掃一掃