void initVideoDecoder(Constants.AVCodecID avCodecID) { if (_codecId != avCodecID) { _codecId = avCodecID; tryOnInitHeader(); } }
private void fireOnFFMPEGFormat(Constants.AVCodecID codecID, int width, int height) { OnFFMPEGFormat callback = FFMPEGFormatEvent; if (callback != null) { callback(codecID, width, height); } }
public static IntPtr VideoDecoder_Create(Constants.AVCodecID videoCodecID) { if (_isX64) { return(FFmpeg64.VideoDecoder_Create(videoCodecID)); } else { return(FFmpeg32.VideoDecoder_Create(videoCodecID)); } }
public void Init(Constants.AVCodecID codecID, int width, int height) { if (_decoder == null || _codecId != codecID || _width != width || _Height != height) { Release(); _decoder = new VideoDecoder(); _decoder.Create(codecID); _codecId = codecID; _width = width; _Height = height; } }
private void video_FFMPEGFormatEvent(Constants.AVCodecID codecID, int width, int height) { _ffmpegCodecId = codecID; _ffmpegWidth = width; _ffmpegHeight = height; FfmpegHeader header = new FfmpegHeader() { CodecID = codecID, Width = width, Height = height }; FfmpegHeader = header; onFfmpegHeaderReceived(new FfmpegHeaderEventArgs(header)); }
private byte[] decodeBC(byte[] buffer, int index) //PS流的节目映射流部分(节目流映射) { int program_stream_map_length = readUshort(buffer, index); //节目流映射长度字段,16位字段。指示紧跟在该字段后的program_stream_map中的字节数。 index += 2; //program_stream_map_length if (program_stream_map_length > 0x3fa || buffer.Length < index + program_stream_map_length) //该字段的最大值为1018(0x3FA)。 { return(null); } index += 2; //当前下一个指示符字段 + 节目流映射版本字段 + 标记位字段 int program_stream_info_length = readUshort(buffer, index); //节目流信息长度字段 index += 2; //ushort(program_stream_info_length) index += program_stream_info_length; int elementary_stream_map_length = readUshort(buffer, index); //基本流映射长度字段,16位字段,指出在该节目流映射中的所有基本流信息的字节长度。 //它只包括stream_type、elementary_stream_id和elementary_stream_info_length字段。(这里注意一下,这里的基本流映射长度,它只包括他后面的指定的那几个定义字段的总和,即从从这个长度,我们可以知道后面它根了几种类型的流定义,因为一种流的这个定义字段:stream_type(1BYTE)、elementary_stream_id(1BYTE)和elementary_stream_info_length(2BYTE)字段总和为4个字节,所以用elementary_stream_map_length /4 可以得到后面定义了几个流类型信息。) index += 2; //elementary_stream_map_length int streamType = buffer[index]; // switch (streamType) { case 0x10: //MPEG-4 视频流 CodecID = Constants.AVCodecID.AV_CODEC_ID_MPEG4; break; case 0x1B: //H.264 视频流 CodecID = Constants.AVCodecID.AV_CODEC_ID_H264; break; case 0x80: //SVAC 视频流 break; case 0x90: //G.711 音频流 case 0x92: //G.722.1 音频流 case 0x93: //G.723.1 音频流 case 0x99: //G.729 音频流 case 0x9B: //SVAC音频流 break; } return(null); }
public bool Create(Constants.AVCodecID videoCodecID) { _decoder = NativeMethods.VideoDecoder_Create(videoCodecID); return(IsOpen); }
public bool Create(string fileName, int width, int height, Constants.AVCodecID videoCodecID, int bitRate) { _file = NativeMethods.FileBuilder_Create(fileName, width, height, videoCodecID, bitRate); return(IsOpen); }
public CodeIdEventArgs(Constants.AVCodecID old, Constants.AVCodecID ne) { OldId = old; NewId = ne; }
private void onCodeIdChanged(Constants.AVCodecID old, Constants.AVCodecID ne) { CodeIdChanged?.Invoke(this, new CodeIdEventArgs(old, ne)); }
public FfmpegStreamDecoder(Constants.AVCodecID codecId, int width, int height) { _decoder = new FfmpegDecoder(); _decoder.Init(codecId, width, height); }
public static extern IntPtr VideoDecoder_Create([MarshalAs(UnmanagedType.I4)] Constants.AVCodecID videoCodecID);
public static extern IntPtr FileBuilder_Create([MarshalAs(UnmanagedType.LPStr)] string fileName, int width, int height, [MarshalAs(UnmanagedType.I4)] Constants.AVCodecID videoCodecID, int bitRate);
public static IntPtr FileBuilder_Create(string fileName, int width, int height, Constants.AVCodecID videoCodecID, int bitRate) { if (_isX64) { return(FFmpeg64.FileBuilder_Create(fileName, width, height, videoCodecID, bitRate)); } else { return(FFmpeg32.FileBuilder_Create(fileName, width, height, videoCodecID, bitRate)); } }
private void _connection_MessageEvent(byte[] message) { MessageReader mr = new MessageReader(message); //Console.WriteLine(mr.MessageID.ToString("X")); switch (mr.MessageID) { case 0x11024: // Msg_Video_Login_Accept getVideo(); fireOnVideoConnected(); break; case 0x11025: // Msg_Video_Login_Reject _videoEvent.Set(); break; case 0x12012: // Msg_Video_Bandwidth { int band1 = mr.Reader.ReadInt32(); int band2 = mr.Reader.ReadInt32(); int band3 = mr.Reader.ReadInt32(); bool urgent = mr.Reader.ReadInt32() != 0; if (band3 > 0) { setVideoLevel(3); } else if (band2 > 0) { setVideoLevel(2); } else if (band1 > 0) { setVideoLevel(1); } else { setVideoLevel(0); } } break; case 0x12123: // Msg_HikM4_Package2 { int level = mr.Reader.ReadInt32(); if (level == _videoLevel) { int frameType = mr.Reader.ReadInt32(); int size = mr.Reader.ReadInt32(); byte[] frameData = mr.Reader.ReadBytes(size); _lastRecvTime = DateTime.Now; fireOnVideoStream(frameType, frameData); if (_decode) { _hikm4Decoder.InputData(frameType, frameData); } } } break; case 0x12025: // Msg_Ffmpeg_Format { int level = mr.Reader.ReadInt32(); if (level == _videoLevel) { _lastRecvTime = DateTime.Now; Constants.AVCodecID codecID = (Constants.AVCodecID)mr.Reader.ReadInt32(); int width = mr.Reader.ReadInt32(); int height = mr.Reader.ReadInt32(); fireOnFFMPEGFormat(codecID, width, height); if (_decode) { _ffmpegDecoder.Init(codecID, width, height); } } } break; case 0x12026: // Msg_Ffmpeg_Frame { int level = mr.Reader.ReadInt32(); if (level == _videoLevel) { _lastRecvTime = DateTime.Now; int type = mr.Reader.ReadInt32(); ulong pts = mr.Reader.ReadUInt64(); int size = mr.Reader.ReadInt32(); byte[] bytes = new byte[size]; mr.Reader.Read(bytes, 0, size); fireOnFFMPEGFrame(type, pts, bytes); if (_decode) { var frame = _ffmpegDecoder.Decode(type, pts, bytes); if (frame != null) { fireOnVideoFrame(frame.Width, frame.Height, frame.Data, (int)frame.Pts); } } } } break; case 0x12027: // Msg_Uniview_Package { string decodeTag = mr.Reader.ReadString(); int size = mr.Reader.ReadInt32(); byte[] data = mr.Reader.ReadBytes(size); fireOnUniviewData(decodeTag, data); if (_decode) { _univiewDecoder.InputData(decodeTag, data); } } break; case 0x12511: // Msg_Transparent_Recv { int length = mr.Reader.ReadInt32(); byte[] data = new byte[length]; mr.Reader.Read(data, 0, length); fireOnResponseData(data); } break; } }