Хорошего настроения каждому зашедшему. Не могу справиться с проблемой. Дано: приложение на с#, удаленный сервер с видео, приложение стримит видео с удаленного сервера. Нужно сделать: сохранение стрима на компьютер, чтобы каждое просмотренное видео можно было отыграть в оффлайне. Идея: сорц видеокомпонента посылает запрос не на сервер, а на "локальную прокси" (класс listener), этот класс заменяет Host в хедере с 127.0.0.1:1489 на айпишник удаленного сервера, начинает стримить с сервера в видеокомпонент, попутно записывая получаемую информацию (видео) на диск. Что есть: собственно, готов сам стрим без использования прокси, класс прокси (подключение к нему проходит успешно). Что не получается сделать: наадить стрим в приложение через класс listener. Не знаю, как послать запрос на получение данных из прокси на сервер. Класс listener (прокси): Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets;
using System.IO; using System.Threading; using System.Text.RegularExpressions;
namespace Teacher { public class Listener {
public TcpListener _listener;
private void HandleClientComm(object client) { TcpClient tcpClient = (TcpClient)client; NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[4096]; int bytesRead;
while (true) { bytesRead = 0;
try { //blocks until a client sends a message bytesRead = clientStream.Read(message, 0, 4096); } catch { //a socket error has occured break; }
if (bytesRead == 0) { //the client has disconnected from the server break; }
//message has successfully been received ASCIIEncoding encoder = new ASCIIEncoding(); string resp = encoder.GetString(message, 0, bytesRead); System.Diagnostics.Debug.WriteLine(resp);
//вот где-то тут нужно формировать и посылать хедер, но я не знаю, как int indx = resp.IndexOf("Host"); string pattern = @"\b(\w+)\s\1\b"; Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase); var address = Dns.GetHostAddresses("hanker.ru")[0];
string newresp = rgx.Replace(resp, "Host: 127.0.0.1:1488", "Host: " + address + ":1488");
}
tcpClient.Close(); }
public Listener() { new Thread(Start) { IsBackground = true }.Start();
}
private void Start() { _listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1488); //catch the MediaPlayer requests here _listener.Start(); while (true) { //blocks until a client has connected to the server TcpClient client = _listener.AcceptTcpClient(); // here was first an message that send hello client // /////////////////////////////////////////////////// //create a thread to handle communication //with connected client Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); clientThread.Start(client); } }
//do streaming and caching here
private int StreamAndSave(Stream outputNetStream, Stream responceStream, Stream fileStream, long fileSize) { int bytesRead = 0; byte[] buffer = new byte[4096]; while (fileSize > 0) { int readBytes = responceStream.Read(buffer, 0, buffer.Length); if (readBytes > 0) { try { //write bytes to response and send it to MediaPlayer outputNetStream.Write(buffer, 0, readBytes); //save to the file system fileStream.Write(buffer, 0, readBytes); bytesRead += readBytes; } catch (Exception e) { break; } } else break; fileSize -= readBytes; } return bytesRead; } } }
|
Код обращения к прокси: Код | private void btnPlayVideo_Click(object sender, RoutedEventArgs e) { var w = SecondWindow.Instance; Listener SnS = new Listener(); //http://serverwithvideo.ru/files/{0}/{1}/video/{2}/{3}.mp4 var uri = new Uri(string.Format(@"http://127.0.0.1:1488/files/{0}/{1}/video/{2}/{3}.mp4", w.DBroot.ShortName, w.CurrentFrame.Episode.Part.SelfIndex + 1, w.CurrentFrame.Episode.SelfIndex + 1, w.CurrentFrame.Scene.SelfIndex + 1)); if (videoPlayer.Source != uri) videoPlayer.Source = uri; if (State == Teacher.VideoState.Playing) { Pause(); } else { Play(); } }
|
Помогите разобраться!
|