FFMPEG - Como gravar múltiplos fluxos RTMP em múltiplos arquivos

0

Eu tentei o seguinte, mas não funciona.

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

Parece pendurado em um segundo fluxo e sem movimento. SOS. Por favor ajude. Eu tenho 4 URLs de fluxo. Eu quero que eles gravem juntos ao mesmo tempo.

With one ffmpeg command:
I want: rtmp://83.229.210.89/RAZTV/BTVraztv1 to record into file: /media/TV_1T_3T_6/ffmpegtest/ort.mp4

I want: rtmp://mirtv.cdnvideo.ru/mirtv-live/mirtv600.sdp to record into file: /media/TV_1T_3T_6/ffmpegtest/mir.mp4 

I want: rtmp://chanson.cdnvideo.ru/chanson-live/shansontv.sdp to record into file: /media/TV_1T_3T_6/ffmpegtest/shansontv.mp4

I want: rtmp://83.229.210.89:1935/TROTV/BTVtro0  to record into file: /media/TV_1T_3T_6/ffmpegtest/tro.mp4 

O log que eu recebo agora é:

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
    
por user3146313 11.07.2014 / 07:57

1 resposta

0

WhooHooo, eu entendi o problema! Então esta é a correção. No meu caso, o FFMPEG estava pendurado em um dos fluxos problemáticos e, portanto, não estava adiantando para iniciar as gravações do restante dos fluxos na lista. Basicamente, com o FFMPEG você tem que executar o comando para cada fluxo em um thread separado. Basicamente, configure o método main no seu jar para iniciar threads separados que então começariam a gravar para cada stream separadamente. Dessa forma, se o ffmpeg não puder se conectar a um deles e não responder, ele não interromperá a gravação do restante dos streams.

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();
        }

    }

}

link

    
por 11.07.2014 / 19:53