一、rtmp服務器搭建
環境:
centos 7.*
1.先安裝docker(省略)
2.下載docker容器
docker pull alfg/nginx-rtmp
3.運行容器(記得打開防火牆端口 1935和8080)
docker run -it -p 1935:1935 -p 8080:80 --rm nginx-rtmp
二、推流方式
ok rtmp服務器 搭建成功,接下來就是推流了(這里列舉三種方式)
第一種:利用OBS Studio推送直播到這個地址
rtmp://服務器ip:1935/stream/自定義名稱
第二種:ffmpeg推送本地視頻為直播流
ffmpeg -re -i /home/holle.flv -vcodec copy -acodec aac -ar 44100 -f flv rtmp://192.168.1.201:1935/stream/example
第三種:利用javacv推本地攝像頭視頻到流媒體服務器(代碼實現如下)
import javax.swing.JFrame;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_objdetect;
import org.bytedeco.javacv.*;
import org.bytedeco.javacv.FrameGrabber.Exception;
public class JavavcCameraTest
{
public static void recordCamera(String outputFile, double frameRate)
throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {
Loader.load(opencv_objdetect.class);
FrameGrabber grabber = FrameGrabber.createDefault(0);//本機攝像頭默認0,這里使用javacv的抓取器,至於使用的是ffmpeg還是opencv,請自行查看源碼
grabber.start();//開啟抓取器
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();//轉換器
opencv_core.IplImage grabbedImage = converter.convert(grabber.grab());//抓取一幀視頻並將其轉換為圖像,至於用這個圖像用來做什么?加水印,人臉識別等等自行添加
int width = grabbedImage.width();
int height = grabbedImage.height();
FrameRecorder recorder = FrameRecorder.createDefault(outputFile, width, height);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264,編碼
recorder.setFormat("flv");//封裝格式,如果是推送到rtmp就必須是flv封裝格式
recorder.setFrameRate(frameRate);
recorder.start();//開啟錄制器
long startTime=0;
long videoTS=0;
CanvasFrame frame = new CanvasFrame("camera", CanvasFrame.getDefaultGamma() / grabber.getGamma());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setAlwaysOnTop(true);
Frame rotatedFrame=converter.convert(grabbedImage);//不知道為什么這里不做轉換就不能推到rtmp
while (frame.isVisible() && (grabbedImage = converter.convert(grabber.grab())) != null) {
rotatedFrame = converter.convert(grabbedImage);
frame.showImage(rotatedFrame);
if (startTime == 0) {
startTime = System.currentTimeMillis();
}
videoTS = 1000 * (System.currentTimeMillis() - startTime);
recorder.setTimestamp(videoTS);
recorder.record(rotatedFrame);
Thread.sleep(40);
}
frame.dispose();
recorder.stop();
recorder.release();
grabber.stop();
}
public static void main(String[] args) throws Exception, InterruptedException, org.bytedeco.javacv.FrameRecorder.Exception {
// recordCamera("D:\\example.mp4",25); //保持到本地
recordCamera("rtmp://192.168.1.201:1935/stream/example",25); //推流到rtmp服務器
}
}
javacv依賴
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.3.2</version>
</dependency>
三、觀看直播(rtmp流)
觀看 rtmp流 可以用PotPlayer
菜單——打開——打開鏈接 貼入rtmp流地址 即可播放了
rtmp://192.168.1.201:1935/stream/example
參考:
https://hub.docker.com/r/alfg/nginx-rtmp/
https://blog.csdn.net/eguid_1/article/details/52678775
---------------------
版權聲明:本文為CSDN博主「dns007」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lipei1220/article/details/80234281