![如何使用FFmpeg將多個RTMP串流錄製到多個檔案中?](https://rvso.com/image/1415070/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8FFmpeg%E5%B0%87%E5%A4%9A%E5%80%8BRTMP%E4%B8%B2%E6%B5%81%E9%8C%84%E8%A3%BD%E5%88%B0%E5%A4%9A%E5%80%8B%E6%AA%94%E6%A1%88%E4%B8%AD%EF%BC%9F.png)
我嘗試了以下方法,但它不起作用。
ffmpeg -i rtmp://83.229.210.89/RAZTV/BTVraztv1 -map 0 -b:v 900k -vcodec libx264 -acodec aac -b:a 256k -strict -2 -t 3600 /media/TV_1T_3T_6/ffmpegtest/ort.mp4 -i rtmp://mirtv.cdnvideo.ru/mirtv-live/mirtv600.sdp -map 1 -b:v 900k -vcodec libx4 -acodec aac -b:a 256k -strict -2 -t 3600 /media/TV_1T_3T_6/ffmpegtest/mir.mp4 -i rtmp://chanson.cdnvideo.ru/chanson-live/shansontv.sdp -map 2 -b:v 900k -vcodec libx264 -acodec aac -b:a 256k -strict -2 -t 3600 /media/TV_1T_3T_6/ffmpegtest/shansontv.mp4 -i rtmp://83.229.210.89:1935/TROTV/BTVtro0 -map 3 -b:v 900k -vcodec libx264 -acodec aac -b:a 256k -strict -2 -t 3600 /media/TV_1T_3T_6/ffmpegtest/tro.mp4
看起來它掛在第二條流上並且沒有任何移動。 SOS 請幫忙。我有 4 個流 URL。我希望他們同時一起錄音。
使用一個 ffmpeg 指令:
- 我想:
rtmp://83.229.210.89/RAZTV/BTVraztv1 to record into file: /media/TV_1T_3T_6/ffmpegtest/ort.mp4
- 我想:
rtmp://mirtv.cdnvideo.ru/mirtv-live/mirtv600.sdp to record into file: /media/TV_1T_3T_6/ffmpegtest/mir.mp4
- 我想:
rtmp://chanson.cdnvideo.ru/chanson-live/shansontv.sdp to record into file: /media/TV_1T_3T_6/ffmpegtest/shansontv.mp4
- 我想:
rtmp://83.229.210.89:1935/TROTV/BTVtro0 to record into file: /media/TV_1T_3T_6/ffmpegtest/tro.mp4
我現在得到的日誌是:
ffmpeg version 2.2.4 Copyright (c) 2000-2014 the FFmpeg developers
built on Jul 6 2014 21:42:17 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libvpx --enable-libmp3lame
libavutil 52. 66.100 / 52. 66.100
libavcodec 55. 52.102 / 55. 52.102
libavformat 55. 33.100 / 55. 33.100
libavdevice 55. 10.100 / 55. 10.100
libavfilter 4. 2.100 / 4. 2.100
libswscale 2. 5.102 / 2. 5.102
libswresample 0. 18.100 / 0. 18.100
libpostproc 52. 3.100 / 52. 3.100
[flv @ 0x24981c0] Stream discovered after head already parsed
Input #0, flv, from 'rtmp://83.229.210.89/RAZTV/BTVraztv1':
Metadata:
Server : NGINX RTMP (github.com/arut/nginx-rtmp-module)
displayWidth : 720
displayHeight : 576
fps : 25
profile :
level :
Duration: 00:00:00.00, start: 1826.816000, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p, 720x576 [SAR 64:45 DAR 16:9], 699 kb/s, 25 fps, 25 tbr, 1k tbn, 50 tbc
Stream #0:1: Audio: aac, 48000 Hz, stereo, fltp, 128 kb/s
Stream #0:2: Data: none
[flv @ 0x261c7e0] Stream discovered after head already parsed
[flv @ 0x261c7e0] negative cts, previous timestamps might be wrong
Last message repeated 8 times
Input #1, flv, from 'rtmp://mirtv.cdnvideo.ru/mirtv-live/mirtv600.sdp':
Metadata:
author :
copyright :
description :
keywords :
rating :
title :
presetname : Custom
creationdate : Fri Jul 11 03:34:37 2014
:
videodevice : AVerMedia Hybrid TV Video Capture
avclevel : 30
avcprofile : 66
videokeyframe_frequency: 5
audiodevice : ?8=. 2E>4 (#AB@>9AB2> A ?>445@6
audiochannels : 1
audioinputvolume: 100
Duration: N/A, start: 0.000000, bitrate: 1038 kb/s
Stream #1:0: Video: h264 (Baseline), yuv420p(tv), 720x576 [SAR 1:1 DAR 5:4], 972 kb/s, 25 fps, 25 tbr, 1k tbn, 50 tbc
Stream #1:1: Audio: mp3, 44100 Hz, mono, s16p, 65 kb/s
Stream #1:2: Data: none
答案1
呼呼,我明白這個問題了!所以這就是解決辦法。就我而言,FFMPEG 掛在有問題的串流之一上,因此不會繼續開始記錄清單中其餘的串流。基本上使用 FFMPEG,您必須在單獨的線程中為每個流執行命令。基本上在 jar 中設定 main 方法來啟動單獨的線程,然後分別開始為每個流進行記錄。這樣,如果 ffmpeg 無法連接到其中一個並掛起,它不會中斷其餘串流的錄製。
package igor.recorder.ffmpeg;
import java.io.IOException;
import java.io.InputStream;
public class RecordRazTV extends Thread {
String streamUrl="rtmp://83.229.210.89/RAZTV/BTVraztv1";
String recordingPath="/media/TV_580_3T_9/raztv";
String recordCommand = "";
String streamAliasFileName="";
public void run() {
System.out.println("Igors Log >> Inside the thread!");
streamAliasFileName = recordingPath.substring(recordingPath.lastIndexOf("/") + 1);
recordCommand = "ffmpeg -i " + streamUrl + " -b:v 900k -vcodec libx264 -acodec aac -b:a 256k -strict -2 -t 3600 /media/TV_1T_3T_6/ffmpegtest/raztv.mp4";
Process p;
try {
System.out.println("Igors Log >> Executing Runtime for FFMPEG: " + recordCommand);
p = Runtime.getRuntime().exec(recordCommand);
System.out.println("Igors Log >> Done executing Runtime for FFMPEG");
InputStream in = p.getErrorStream();
int c;
while ((c = in.read()) != -1)
{
System.out.print((char)c);
}
in.close();
interrupt();
} catch (IOException e) {
e.printStackTrace();
}
}
}