private void FileEmergencyPlayThread(object obj) { UdpClient udpserver = new UdpClient(9999); IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0); WorkProcessHandler h = new WorkProcessHandler(FileEmergencyPlayProcess); ThreadParam ap = (ThreadParam)obj; DeviceListener.Device d = deviceListener.Find(ap.id); if (d == null) { return; } int ret = deviceListener.FileEmergencyPlayStart(d, "0.0.0.0", 9999, ap.filename, ap.streamtype, ap.volume, d.id.ToString()); if (ret != 0) { return; } FileStream fs = File.OpenRead(ap.filename); if (fs == null) { return; } try { long starttime = DateTime.Now.Ticks; string d_ip = null; int d_port = 0; while ((DateTime.Now.Ticks - starttime) < 3000 * 10000)//3000ms { if (udpserver.Available > 0) { byte[] bs = udpserver.Receive(ref ep); string s = System.Text.Encoding.Default.GetString(bs); if (s.Contains(d.id.ToString())) { d_ip = ep.Address.ToString(); d_port = ep.Port; break; } } } if (d_port != 0) { int playfiletime = 0; int time = System.Environment.TickCount; int starttime1 = time; bool eof = false; byte[] fbs = new byte[320]; short[] pcm = new short[160]; int sequenceNumber = 0; long timestamp = 0; fs.Read(fbs, 0, 44); long writebytes = 44; while (!eof) { int runtime = System.Environment.TickCount - starttime1; if ((runtime + 500) >= playfiletime) { int readbytes = fs.Read(fbs, 0, fbs.Length); IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(fbs, 0); Marshal.Copy(p, pcm, 0, 160); //GroovyCodecs.G711.uLaw.ULawEncoder g711encode = new GroovyCodecs.G711.uLaw.ULawEncoder(); //byte[] ba = g711encode.Process(pcm); byte[] ba = g711.g711Encode_ulwa(pcm); RtpPacket packet = new RtpPacket(RtpPayloadType.G711_uLaw, sequenceNumber, timestamp, ba, ba.Length); sequenceNumber++; timestamp += 20;// ba.Length; playfiletime += 20; udpserver.Send(packet.ToArray(), packet.Length, d_ip, d_port); writebytes += readbytes; if (readbytes < fbs.Length) { eof = true; } int process = (int)(100 * writebytes / fs.Length); this.BeginInvoke(h, d, ap.filename, false, process); } } } udpserver.Close(); Thread.Sleep(500); deviceListener.FileEmergencyPlayStop(d); this.BeginInvoke(h, d, ap.filename, true, 0); } catch (ThreadAbortException abortException) { udpserver.Close(); dataThread = null; } }