private void Seek(long mediaPosition, double playbackRate, bool seekToSyncPoint) { viewer.Stop(); lock (seekingLock) { // Seek to the closest video sync point in the file. fileParser.Seek(ref mediaPosition); if (!seekToSyncPoint) { // make viewer preroll all samples before this position viewer.SetStartTime((long)mediaPosition); } if (playbackRate != viewer.PlaybackRate) { viewer.PlaybackRate = playbackRate; } if (CurrentPlaybackState == Enum_VideoPlaybackState.Paused) { viewer.Pause(); } else { viewer.Start(); } } }
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)); } }
private void Axis_VideoColse() { if (parser != null) { if (parser.Status == (int)AMP_STATUS.AMP_STATUS_RUNNING) { parser.Stop(); viewer.Stop(); } if (CurrentVideoPlaySet.VideoRecordEnable && lstVideoRecord.Count > 0) { Axis_GenerateRecord(CurrentVideoPlaySet.VideoRecordFilePath); } parser.OnVideoSample -= OnVideoSample; parser.OnAudioSample -= OnAudioSample; parser.OnMetaDataSample -= OnMetaDataSample; parser.OnError -= OnError; viewer.OnDecodedImage -= OnDecodedImage; Marshal.FinalReleaseComObject(viewer); viewer = null; Marshal.FinalReleaseComObject(parser); parser = null; VideoRecordStatus = false; } }
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(); } } } }