public void Start() { Running = true; Thread downloadThread = null; downloadThread = new Thread(() => { _hc = new HttpClient(); FullPath = Path.Combine(_path, _fname + DateTime.Now.ToString("_yyyyMMdd_Hmmss") + ".flv"); _stream2FileWriter = new FlvStream2FileWriter(FullPath); try { _flvNetStream = _hc.GetStreamAsync(_url).Result; } catch (Exception) { DownloadInterruptedEvent?.Invoke(this, null); return; } int buffer_size = 4096; byte[] buffer = new byte[buffer_size]; AsyncCallback callback = null; callback = ar => { try { // Call EndRead. int bytesRead = _flvNetStream.EndRead(ar); // Process the bytes here. if (bytesRead != buffer.Length) { if (bytesRead == 0) { _flvNetStream.Dispose(); _flvNetStream = null; Running = false; return; } _stream2FileWriter.Write(buffer.Take(bytesRead).ToArray()); } else { _stream2FileWriter.Write(buffer); } _flvNetStream.BeginRead(buffer, 0, buffer_size, callback, null); } catch (Exception e) { // just close and return for now on error... _flvNetStream?.Dispose(); _flvNetStream = null; _hc?.Dispose(); _hc = null; Running = false; DownloadInterruptedEvent?.Invoke(this, null); return; } }; _flvNetStream.BeginRead(buffer, 0, buffer_size, callback, null); while (_flvNetStream != null) { Thread.Sleep(125); } _stream2FileWriter.FinallizeFile(); downloadThread.Interrupt(); }); downloadThread.Start(); }
static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("Usage:\nConsoleTest.exe \"infile.flv\" \"outfile.flv\""); return; } // We just test from a file source FlvStream2FileWriter stream2File = new FlvStream2FileWriter(args[1]); try { FileStream fs = new FileStream(args[0], FileMode.Open); int BUF_LEN = 4096; byte[] buffer = new byte[BUF_LEN]; AsyncCallback callback = null; callback = ar => { try { // Call EndRead. int bytesRead = fs.EndRead(ar); // Process the bytes here. if (bytesRead != buffer.Length) { if (bytesRead == 0) { fs.Dispose(); fs = null; return; } stream2File.Write(buffer.Take(bytesRead).ToArray()); } else { stream2File.Write(buffer); } fs.BeginRead(buffer, 0, BUF_LEN, callback, null); Console.Write("."); } catch (Exception e) { // just close and return for now on error... fs.Dispose(); fs = null; return; } }; fs.BeginRead(buffer, 0, BUF_LEN, callback, null); while (fs != null) { // this could be better ;) System.Threading.Thread.Sleep(125); } } catch (Exception ex) { // Set a break point here so you can debug from VS Console.Write(ex.Message); } finally { // stream2File.FinallizeFile(); Console.WriteLine(""); Console.WriteLine(string.Format("Duraction: {0}s", stream2File.MaxTimeStamp / 1000.0)); Console.WriteLine(string.Format("Num Audio: {0}", stream2File.NumAudio)); Console.WriteLine(string.Format("Num Video: {0}", stream2File.NumVideo)); } }