void RenderThread(object obj) { IntPtr hWnd = (IntPtr)obj; AxisMediaViewer viewer = new AxisMediaViewer(); viewer.VMR9 = true; try { using (FileStream inFileStream = new FileStream(videoPath, FileMode.Open)) using (BinaryReader inFile = new BinaryReader(inFileStream, Encoding.UTF32)) { if (inFile.PeekChar() != -1) { int mediaTypeSize = inFile.ReadInt32(); byte[] mediaTypeBuffer = inFile.ReadBytes(mediaTypeSize); long startPosition = inFile.BaseStream.Position; while (true) { viewer.Init(1, mediaTypeBuffer, hWnd.ToInt64()); viewer.Start(); while (inFile.PeekChar() != -1) { // Read frame data int sampleType = inFile.ReadInt32(); int sampleFlags = inFile.ReadInt32(); ulong startTime = inFile.ReadUInt64(); ulong stopTime = inFile.ReadUInt64(); int bufferSize = inFile.ReadInt32(); byte[] bufferBytes = inFile.ReadBytes(bufferSize); // Check that it’s not an audio sample. if (sampleType != (int)AMV_VIDEO_SAMPLE_TYPE.AMV_VST_MPEG4_AUDIO) { // Let the viewer render the frame viewer.SetVideoPosition(VideoXPos, VideoYPos, VideoXPos + VideoWidth, VideoYPos + VideoHeight); viewer.RenderVideoSample(sampleFlags, startTime, stopTime, bufferBytes); } } inFile.BaseStream.Position = startPosition; viewer.Stop(); } } else { Console.WriteLine(string.Format("File at {0} is empty or malformed", videoPath)); Environment.Exit(0); } } } catch (COMException e) { MessageBox.Show(string.Format("Exception {0}", e.Message)); } }
/// <summary> /// 回调_视频信息 /// </summary> /// <param name="cookieID"></param> /// <param name="sampleType"></param> /// <param name="sampleFlags"></param> /// <param name="startTime"></param> /// <param name="stopTime"></param> /// <param name="SampleArray"></param> private void OnVideoSample(int cookieID, int sampleType, int sampleFlags, ulong startTime, ulong stopTime, object SampleArray) { #region 视频录像 if (CurrentVideoPlaySet.VideoRecordEnable) { lock (objVideoRecordLock) { byte[] bufferBytes = (byte[])SampleArray; lstVideoRecord.AddRange(BitConverter.GetBytes(sampleType)); lstVideoRecord.AddRange(BitConverter.GetBytes(sampleFlags)); lstVideoRecord.AddRange(BitConverter.GetBytes(startTime)); lstVideoRecord.AddRange(BitConverter.GetBytes(stopTime)); lstVideoRecord.AddRange(BitConverter.GetBytes(bufferBytes.Length)); lstVideoRecord.AddRange(bufferBytes); } } #endregion long renderStartTime = 0; long renderStopTime = 1; if ((long)startTime + parser.LiveTimeOffset > 0) { renderStartTime = (long)startTime + parser.LiveTimeOffset; renderStopTime = (long)stopTime + parser.LiveTimeOffset; } viewer.RenderVideoSample(sampleFlags, (ulong)renderStartTime, (ulong)renderStopTime, SampleArray); VideoPlayCallback(new VideoPlayCallbackValue { evType = Enum_VideoPlayEventType.VideoPlay }); VideoPlayState = Enum_VideoPlayState.InPlayState; }
private void RenderThread() { try { // While there are frames in the in file, read each frame and let the viewer render it while (!doExitRenderThread) { AmpFileSample sample = null; lock (seekingLock) { sample = fileParser.ReadSample(); } if (sample == null) { // end-of-file reached - wait for all samples to render before stopping viewer if (viewer.Flush()) { BeginInvoke(new EndOfStreamDelegate(OnEndOfStream)); break; } } else { switch (sample.SampleType) { case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_MPEG4_VIDEO_CONFIG: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_MPEG4_VIDEO_IVOP: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_MPEG4_VIDEO_PVOP: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_MPEG4_VIDEO_BVOP: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_MPEG4_VIDEO_FRAGMENT: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_MJPEG_VIDEO: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_H264_VIDEO_CONFIG: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_H264_VIDEO_IDR: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_H264_VIDEO_NON_IDR: case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_H264_VIDEO_SEI: if ((viewer.PlayOptions & (int)AMV_PLAY_OPTIONS.AMV_PO_VIDEO) > 0) { if (playbackRate >= 32 && ((int)AMP_SAMPLE.AMP_S_SYNCPOINT & sample.SampleFlags) == 0) { // skip non-sync point video if playback rate is x32 or higher continue; } viewer.RenderVideoSample(sample.SampleFlags, sample.StartTime, sample.StopTime, sample.Buffer); } break; case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_MPEG4_AUDIO: if ((viewer.PlayOptions & (int)AMV_PLAY_OPTIONS.AMV_PO_AUDIO) > 0) { viewer.RenderAudioSample(sample.SampleFlags, sample.StartTime, sample.StopTime, sample.Buffer); } break; case (int)AMP_VIDEO_SAMPLE_TYPE.AMP_VST_METADATA_ONVIF: if ((viewer.PlayOptions & (int)AMV_PLAY_OPTIONS.AMV_PO_META) > 0) { string metadataDoc = System.Text.Encoding.UTF8.GetString(sample.Buffer); viewer.RenderMetadataSample(sample.SampleFlags, sample.StartTime, sample.StopTime, metadataDoc); } break; default: throw new Exception("Unknown sample type"); } } } } catch (COMException e) { MessageBox.Show(string.Format("Exception for {0}, {1}", CurrentVideoRecordInfo.RecordPath, e.Message)); } }
void renderThreadDoUpdate(object obj) { if (!File.Exists(m_videoPath)) { Console.WriteLine("startRenderThread: Could not find file {0}, exiting", m_videoPath); throw new Exception("File Not Found"); } using (FileStream inFileStream = new FileStream(m_videoPath, FileMode.Open, FileAccess.Read)) { using (BinaryReader inFile = new BinaryReader(inFileStream, Encoding.UTF32)) { if (inFile.PeekChar() == -1) { Console.WriteLine("startRenderThread: file {0} is empty, exiting", m_videoPath); throw new Exception("File is Empty"); } IntPtr hWnd = (IntPtr)obj; int mediaTypeSize = inFile.ReadInt32(); byte[] mediaTypeBuffer = inFile.ReadBytes(mediaTypeSize); long headerOffset = inFileStream.Position; // save the width of the header so we don't read it again. while (true) { AxisMediaViewer viewer = new AxisMediaViewer(); viewer.VMR9 = true; try { viewer.Init(0, mediaTypeBuffer, hWnd.ToInt64()); } catch (Exception e) { Console.WriteLine("Got Exception initializing player: {0} exiting", e); throw new Exception("Failed to Initialize Player"); } viewer.SetVideoPosition(m_videoXPos, m_videoYPos, m_videoXPos + m_videoWidth, m_videoYPos + m_videoHeight); viewer.Start(); while (inFile.PeekChar() != -1) { // Read frame data int sampleType = inFile.ReadInt32(); int sampleFlags = inFile.ReadInt32(); ulong startTime = inFile.ReadUInt64(); ulong stopTime = inFile.ReadUInt64(); int bufferSize = inFile.ReadInt32(); byte[] bufferBytes = inFile.ReadBytes(bufferSize); if (sampleType != (int)AMV_VIDEO_SAMPLE_TYPE.AMV_VST_MPEG4_AUDIO && bufferSize > 0) { try { viewer.RenderVideoSample(sampleFlags, startTime, stopTime, bufferBytes); } catch (Exception e) { Console.WriteLine("Caught Exception {0} when trying to render frame.", e); } } } inFileStream.Position = headerOffset; viewer.Stop(); } } } }