使用FFmpeg如何轉發一個RTSP視頻流


 
轉發RTSP流,這類需求一般出現於轉發一些攝像頭采集視頻,並在攝像頭上做RTSP Server,然后通過轉發的設備將視頻內容轉發出去。或者是直接拉取網絡上的一些RTSP服務器的內容流,然后進行轉發。
 
如果轉發設備是Windows,則需要做的事情,就是在Windows上安裝FFmpeg,配置好環境后,直接執行類似下面的命令即可(地址需要替換成你需要的地址):
ffmpeg -i rtsp://localhost/live -c copy -f flv rtmp://server/live/h264Stream

如果需要在Android設備上轉發RTSP流,則需要用到JavaCV。相關介紹可以參考:JavaCV 初體驗

核心邏輯如下:

long startTimestamp = 0;
FrameGrabber grabber = FFmpegFrameGrabber.createDefault(inputPath);
try {
  grabber.start();
} catch (Exception e) {
   try {
     grabber.restart();
   } catch (Exception e1) {
      throw e;
  }
}
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
Frame grabframe = grabber.grab();
IplImage grabbedImage = null;
if (grabframe != null) {
  Log.e(TAG, "has fetched first frame");
   grabbedImage = converter.convert(grabframe);
} else {
    Log.e(TAG, "not fetched first frame");
 }
 FrameRecorder recorder = FrameRecorder.createDefault(outputPath, 640, 360);
 recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // avcodec.AV_CODEC_ID_H264
 recorder.setFormat("flv");
 recorder.setFrameRate(25);
 recorder.setGopSize(10);try {
   recorder.start();
 } catch (FrameRecorder.Exception e) {
    try {
         Log.e(TAG, "recorder start failed, try to restart recorder...");
         Log.e(TAG, "close recorder...");
         recorder.stop(); // 停止錄制器的執行狀態
         Log.e(TAG, "restart recorder...");
         recorder.start(); // 開啟錄制器
    } catch (FrameRecorder.Exception e1) {
        throw e;
     }
 }

Log.e(TAG,
"start push stream"); while ((grabframe = grabber.grab()) != null && push_stream) {
   grabbedImage
= converter.convert(grabframe); Frame rotatedFrame = converter.convert(grabbedImage);    if (startTimestamp == 0) {   startTimestamp = System.currentTimeMillis(); }   
recorder.setTimestamp(
1000 * (System.currentTimeMillis() - startTimestamp));// 時間戳 if (rotatedFrame != null) {   recorder.record(rotatedFrame); } } Log.e(TAG, "has stop push stream"); recorder.stop(); recorder.release(); grabber.stop(); 

最重要的兩個對象為:FFmpegFrameGrabber 和 FrameRecorder,其中FFmpegFrameGrabber負責逐幀解碼,FrameRecorder負責逐幀編碼。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM