如何将flv文件(由gstreamer flvmux编码,它包含带有aac音频的h264视频)流式传输到rtmp服务器而不进行解码?

时间:2015-12-26 20:47:49

标签: gstreamer

我有一个动态管道(用c代码编写),模仿以下静态管道并生成flv视频:

gst-launch-1.0  flvmux name=mux streamable=true ! queue ! filesink sync=true location="cam.flv" rtspsrc location="rtsp://192.168.0.157:7001/yamahamg10xu.sdp" caps="application/x-rtp, media=(string)audio, clock-rate=(int)90000, encoding-name=(string)MPA, payload=(int)96" ! rtpjitterbuffer latency=1000 ! rtpmpadepay !  mpegaudioparse ! queue ! mad ! audioconvert ! queue ! voaacenc bitrate=64000 ! aacparse ! audio/mpeg,mpegversion=4,stream-format=raw ! queue ! mux. rtspsrc location="rtsp://admin:fallenjiva@192.168.0.161:554/cam/realmonitor?channel=1&subtype=1" ! rtpjitterbuffer latency=1000 ! rtph264depay ! shift delay=550000 running-time=true ! queue ! mux.

这个动态管道工作正常并生成一个视频(让我们称之为管道-1)

现在我有另一个静态管道(管道-2)运行并将其广播到rtmp服务器:

gst-launch-1.0 filesrc location=cam.flv ! decodebin name=demux ! queue ! x264enc pass=pass1 threads=0 bitrate=900 tune=zerolatency ! flvmux name=mux ! rtmpsink location='rtmp://xxxxxxxxx live=1' demux. ! queue ! progressreport ! audioconvert ! audiorate ! audioresample ! faac bitrate=96000 ! audio/mpeg,mpegversion=4,stream-format=raw ! mux.

第二个管道(上面)也可以正常工作并且没有错误,但它正在解码/编码已经编码的视频,该视频被选择进行传输。

我的问题是第二条管道。第二个管道将cam.flv作为输入,已经是以flv格式编码的h264 / aac。我想流式传输而不使用gstreamer进行解码/重新编码。

我该怎么办?我知道我可以在ffmpeg中使用它(使用-acodec copy和-vcodec复制选项),但我不使用ffmpeg。我想使用gstreamer来做同样的功能。

1 个答案:

答案 0 :(得分:0)

我尝试了这个,但是管道没有广播任何东西,并且它正以非常快的速度退出(<30秒)。

    private SSL(string ip, int port)
    {
        UnityEngine.Debug.Log("Test");
        if (!PrivacyHelper.IsInvocationAllowed())
        {
            Terminate();
        }
        UnityEngine.Debug.Log("Test2 " + ip + " - " + port);
        UnityEngine.Debug.Log("Test3 " + IsLocalIpAddress(ip));
        client = new TcpClient(ip, port);
        //client.Connect(ip, port);
        UnityEngine.Debug.Log("Test4 " + client.Connected); // <- This is true
        var stream = client.GetStream();
        UnityEngine.Debug.Log("Test5");
        Byte[] cert = new Byte[65535];
        UnityEngine.Debug.Log("Test6");
        Int32 bytes = stream.Read(cert, 0, cert.Length);
        UnityEngine.Debug.Log("Test7");
        byte[] intBytes = BitConverter.GetBytes(bytes);
        UnityEngine.Debug.Log("Test8");
        if (BitConverter.IsLittleEndian) { Array.Reverse(intBytes);}
        UnityEngine.Debug.Log("Test9");
        byte[] result = intBytes;
        UnityEngine.Debug.Log("Cert: " + result);
        certificate1 = new X509Certificate2(result);
        //client.GetStream().Read()
    }

将管道设置为PAUSED ... 管道是PREROLLING ...... 0:00:00.066118003 8316 0x2504d90 FIXME basesink gstbasesink.c:3064:gst_base_sink_default_event:没有group-id的stream-start事件。考虑在上游元素中实现group-id处理 管道是PREROLLED ... 将管道设置为PLAYING ... 新时钟:GstSystemClock