2012-04-09 7 views
2

私は、RTPパケットがブラックボックスデバイスから外れるログファイルを持っています。私はそれに対応するSDPファイル(RTSP DESCRIBE)も持っています。このファイルを再生可能なビデオファイルに変換する必要があります。これらの2つのファイルをFFMpegやVLCなどに渡して、そのデータを再生可能なものに多重化できますか?私はRTPパケットのログファイルを持っています:今は何ですか?

別の計画として、コード内の個々のパケットをループし、各パケットで何かを行うことができます。しかし、このデータを解析するための既存のライブラリがあるようです。そして手作業で大規模なプロジェクトを求めているようだ。 SDPとRTPをかなり混ぜ合わせたビデオファイル形式がありますか?御時間ありがとうございます。

FFmpegまたはVLCがSDPファイルを開いて、入力パケットをSTDINで取得する方法はありますか?

私は一般的にC#を使用しますが、必要に応じてCを使用できます。

更新1:ここに私のコードがあります。私はffplayで遊ぶためにある種の出力を得ようとしていますが、私はまだ運がありませんでした。それは私に無効なデータエラーを与えます。私が知る限り、すべてのデータを正確に調べます。私の出力は私の入力とほぼ同じ大きさです(約4MB)。

public class RtpPacket2 
    { 
     public byte VersionPXCC; 
     public byte MPT; 
     public ushort Sequence; // length? 
     public uint Timestamp; 
     public uint Ssrc; 
     public int Version { get { return VersionPXCC >> 6; } } 
     public bool Padding { get { return (VersionPXCC & 32) > 0; } } 
     public bool Extension { get { return (VersionPXCC & 16) > 0; } } 
     public int CsrcCount { get { return VersionPXCC & 0xf; } } // ItemCount 
     public bool Marker { get { return (MPT & 0x80) > 0; } } 
     public int PayloadType { get { return MPT & 0x7f; } } // PacketType 
    } 


    static void Main(string[] args) 
    { 
     if (args.Length != 2) 
     { 
      Console.WriteLine("Usage: <input RTP file> <output 3GP file>"); 
      return; 
     } 
     var inputFile = args[0]; 
     var outputFile = args[1]; 
     if(File.Exists(outputFile)) File.Delete(outputFile); 

     // FROM the SDP : fmtp 96 profile-level-id=4D0014;packetization-mode=0 
     var sps = Convert.FromBase64String("Z0LAHoiLUFge0IAAA4QAAK/IAQ=="); //  BitConverter.ToString(sps) "67-42-C0-1E-88-8B-50-58-1E-D0-80-00-03-84-00-00-AF-C8-01" string 
     var pps = Convert.FromBase64String("aM44gA=="); //  BitConverter.ToString(pps) "68-CE-38-80" string 
     var sep = new byte[] { 00, 00, 01 }; 

     var packet = new RtpPacket2(); 
     bool firstFrame = true; 
     using (var input = File.OpenRead(inputFile)) 
     using (var reader = new BinaryReader(input)) 
     using (var output = File.OpenWrite(outputFile)) 
     { 
      //output.Write(header, 0, header.Length); 
      output.Write(sep, 0, sep.Length); 
      output.Write(sps, 0, sps.Length); 
      output.Write(sep, 0, sep.Length); 
      output.Write(pps, 0, pps.Length); 
      output.Write(sep, 0, sep.Length); 
      while (input.Position < input.Length) 
      { 
       var size = reader.ReadInt16(); 
       packet.VersionPXCC = reader.ReadByte(); 
       packet.MPT = reader.ReadByte(); 
       packet.Sequence = reader.ReadUInt16(); 
       packet.Timestamp = reader.ReadUInt32(); 
       packet.Ssrc = reader.ReadUInt32(); 
       if (packet.PayloadType == 96) 
       { 
        if (packet.CsrcCount > 0 || packet.Extension) throw new NotImplementedException(); 

        var header0 = reader.ReadByte(); 
        var header1 = reader.ReadByte(); 

        var fragmentType = header0 & 0x1F; // should be 28 for video 
        if(fragmentType != 28) // 28 for video? 
        { 
         input.Position += size - 14; 
         continue; 
        } 
        var nalUnit = header0 & ~0x1F; 
        var nalType = header1 & 0x1F; 
        var start = (header1 & 0x80) > 0; 
        var end = (header1 & 0x40) > 0; 

        if(firstFrame) 
        { 
         output.Write(sep, 0, sep.Length); 
         output.WriteByte((byte)(nalUnit | fragmentType)); 
         firstFrame = false; 
        } 

        for (int i = 0; i < size - 14; i++) 
         output.WriteByte(reader.ReadByte()); 
        if (packet.Marker) 
         firstFrame = true; 
       } 
       else input.Position += size - 12; 
      } 
     } 
    } 
+0

ねえ、あなたは私にsharpffpemgライブラリのダウンロードリンクを教えてくれませんか?私はそれをどこからでも見てきました。とても感謝しています。ありがとう。 – idish

答えて

0

http://www.bogotobogo.com/VideoStreaming/videostreaming_etc.php

あなたがパケット化されているか符号化ストリームの詳細に行き詰まる可能性があるため、離れパケットレベルで何もしてからご利用いただけます。

上記のリンクを見てください。 SDP/RTP/RTSPストリーミングは、ローカルのメディアファイルを開くだけのプレーヤーに直接接続しようとすると、通常は機能しないプロトコルになります。

ストリームを処理していてストリームからファイルを保存する場合は、大きなメディアプロジェクト(ffmpeg、vlc、live555、openrtsp)でgoogle 'filesinks' fileSink実装(C、C++)

たとえば、live555では、すべてのコーデックに./live/liveMediaディレクトリ内のfileSink実装があります。

SDPソースからのストリームがある場合は、そのトラックで使用されているコーデックのfileSinkで各トラック(オーディオ、ビデオ)を処理できます。その後、それらのトラックをプレーヤーに多重化したり、トラックを独立して再生したりすることができます。

0

vlcでSDPファイルを開き、VLCがそれらを受信できるようにネットワークにRTPパケットを再再生するための小さなアプリケーションを作成します。 127.0.0.1とSDPファイルと一致するポート番号で再生することを確認してください。

VLCはパケットを受信するまで待機し、VLCを使用してMP4などのファイル形式にトランスコードせずにメディアを保存します。

関連する問題