![FFmpeg를 사용하여 여러 RTMP 스트림을 여러 파일에 기록하는 방법은 무엇입니까?](https://rvso.com/image/1415070/FFmpeg%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%97%AC%EB%9F%AC%20RTMP%20%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%84%20%EC%97%AC%EB%9F%AC%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EA%B8%B0%EB%A1%9D%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.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에 기본 메소드를 설정하여 별도의 스레드를 시작한 다음 각 스트림에 대해 별도로 녹음을 시작합니다. 이렇게 하면 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();
}
}
}