<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Блог Вани Коротеева</title>
	<atom:link href="http://rosomakho.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://rosomakho.ru</link>
	<description>Программирование, компьютеры и все что с ними связано.</description>
	<lastBuildDate>Sat, 19 May 2012 17:03:19 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>C# Записываем видео и звук с веб-камеры</title>
		<link>http://rosomakho.ru/proj_prof/csharp-zapisyvaem-video-i-zvuk-s-web-kamery/</link>
		<comments>http://rosomakho.ru/proj_prof/csharp-zapisyvaem-video-i-zvuk-s-web-kamery/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 09:13:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[Проекты Вани]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=2008</guid>
		<description><![CDATA[Всем привет! Когда-то я прочитал статью C# берем web камеру под контроль и тема работы с веб-камерой и получения с нее видео меня весьма заинтересовала. В конце концов я попробовал различные библиотеки, доступные начинающему программисту, и собираюсь рассказать в этой статье как же все-таки записать видео со звуком с веб-камеры. 1. Звук. Записать звук с [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет!<br />
Когда-то я прочитал статью <a href="http://www.vr-online.ru/content/c-berem-web-kameru-pod-kontrol-2417">C# берем web камеру под контроль</a><br />
и тема работы с веб-камерой и получения с нее видео меня весьма заинтересовала.<br />
В конце концов я попробовал различные библиотеки, доступные начинающему программисту, и собираюсь рассказать в этой статье как же все-таки записать видео со звуком с веб-камеры.<br />
<span id="more-2008"></span><br />
1. Звук.<br />
Записать звук с микрофона, который почти наверняка встроен в камеру, достаточно просто. Можно воспользоваться виндовой библиотекой winmm.dll.<br />
Вот код для нее:</p>
<pre class="brush: csharp">
public class WmvClass2
{
public int duration=0;
public bool StateBusy=false;
//для начала сделаем импорт нужной нам функции
[DllImport(&quot;winmm.dll&quot;, EntryPoint = &quot;mciSendStringA&quot;, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
/// &lt;summary&gt;
/// creates c:test.wav duration 5 seconds
/// &lt;/summary&gt;
public static void MainF()
{
while (true)
{
//откроем устройство для записи аудио с микрофона
mciSendString(&quot;open new Type waveaudio Alias recsound&quot;, &quot;&quot;, 0, 0);

//начнем запись
mciSendString(&quot;record recsound&quot;, &quot;&quot;, 0, 0);

//остановим цикл на (5 минут 5*60=300 * 1000мкс) (5000=5 сек), для сбора данных
Thread.CurrentThread.Join(5000);
//сбросим записанные данные в файл
mciSendString(@&quot;save recsound C:test222.wav&quot;, &quot;&quot;, 0, 0);
//закроем устройство записи
mciSendString(&quot;close recsound &quot;, &quot;&quot;, 0, 0);
//сгенерируем имя архива и сделаем архивацию аудион файла. Почему именно таким образон а не сразу в mp3?
//К сожалению mci не умеет писать в mp3, по непонятным пока мне причинам.
Random rand = new Random();
FileStream stream = new FileStream(@&quot;C:test222.wav&quot;, FileMode.Open);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Close();
//пакуем в gzip(необязательно!)
GZipStream gzip = new GZipStream(File.Open(@&quot;C:test222-&quot; + rand.Next(1000, 5000) + &quot;.gzip&quot;, FileMode.Create), CompressionMode.Compress);
gzip.Write(bytes, 0, bytes.Length);
gzip.Close();
//File.Delete(@&quot;C:test.wav&quot;);
}
}
/// &lt;summary&gt;
/// начинаем запись по указанному пути
/// путь с ОДНИМ слешом(типа c:test5.wav)
/// &lt;/summary&gt;
///
public void StartF(string infilePath)
{

this.filePath=infilePath;

//откроем устройство для записи аудио с микрофона
mciSendString(&quot;open new Type waveaudio Alias recsound&quot;, &quot;&quot;, 0, 0);

//начнем запись
mciSendString(&quot;record recsound&quot;, &quot;&quot;, 0, 0);

}
/// &lt;summary&gt;
/// сохраняем вмв в файл
/// &lt;/summary&gt;
public void StopF()
{

//сбросим записанные данные в файл
mciSendString(@&quot;save recsound &quot;+this.filePath, &quot;&quot;, 0, 0);
//закроем устройство записи
mciSendString(&quot;close recsound &quot;, &quot;&quot;, 0, 0);

}
}
</pre>
<p>Можно также для записи звука использовать библиотеку NAudio.dll , у нее есть версия для .net и она дает чуть более чистый звук без помех. Вот код для нее:</p>
<pre class="brush: csharp">
using NAudio.Wave;
using NAudio.FileFormats;
using NAudio.CoreAudioApi;
using NAudio;
public class WmvClass2
{
//new version
private string filePath = &quot;&quot;;
// WaveIn - поток для записи
WaveIn waveIn;
//Класс для записи в файл
WaveFileWriter writer;
public void StopF()
{
if (waveIn != null)
{
StopRecording();
waveIn.Dispose();
waveIn = null;
writer.Close();
writer = null;
}

}
public void StartF(string infilePath)
{
try
{
// MessageBox.Show(&quot;Start Recording&quot;);
//listBox1.Items.Add(&quot;Start Recording&quot;);
this.filePath = infilePath;
waveIn = new WaveIn();
//Дефолтное устройство для записи (если оно имеется)
waveIn.DeviceNumber = 0;
//Прикрепляем к событию DataAvailable обработчик, возникающий при наличии записываемых данных
waveIn.DataAvailable += waveIn_DataAvailable;
//Прикрепляем обработчик завершения записи
waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);
//Формат wav-файла - принимает параметры - частоту дискретизации и количество каналов(здесь mono)
//waveIn.WaveFormat = new WaveFormat(8000, 1);
waveIn.WaveFormat = new WaveFormat(44100,8, 2);
//Инициализируем объект WaveFileWriter
writer = new WaveFileWriter(infilePath, waveIn.WaveFormat);
//Начало записи
waveIn.StartRecording();
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
//listBox1.Items.Add(ex.Message);
}
}
//Получение данных из входного буфера и обработка полученных с микрофона данных
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{

//Записываем данные из буфера в файл
writer.WriteData(e.Buffer, 0, e.BytesRecorded);

}
//Завершаем запись
void StopRecording()
{
//MessageBox.Show(&quot;StopRecording&quot;);
//listBox1.Items.Add(&quot;Stop Recording&quot;);
waveIn.StopRecording();
}
//Окончание записи
private void waveIn_RecordingStopped(object sender, EventArgs e)
{

//this.BeginInvoke(new EventHandler(waveIn_RecordingStopped), sender, e);

waveIn.Dispose();
waveIn = null;
writer.Close();
writer = null;

}

}
</pre>
<p>Тут все достаточно понятно, поэтому пойдем дальше.<br />
2. Получаем с веб-камеры Jpeg картинку.<br />
После попыток понять, как же сгенерировать видео, я пришел к выводу, что проще всего будет сделать так: собирать таймером 5 (или 10) раз в секунду с камеры текущую картинку (bitmap) и затем собирать все картинки за минуту в видео. Почему я сделал имено так? У меня упомянутая в той статье avicap32.dll достаточно сильно подтормаживала комп, зачастую делала слишком большие видео (даже при попытке уменьшить их и выбрать другой кодек сжатия) и, в общем, как-то мне не понравилась. А Aforge.Net, конечно, хорошо подходит для отслеживания движений, однако такой задачи я не ставил. Да и снимать с камеры картинку можно гораздо проще, чем это сделано в Aforge. Как собрать отснятые картинки в видео, рассмотрю в следующей главе.<br />
Итак, библиотека для работы с веб-камерой, которую я выбрал &#8212; DirectShowLib-2005.dll<br />
На ее сайте http://sourceforge.net/projects/directshownet/files/ есть отличные примеры, из которых я и выдрал код для взаимодействия с камерой.<br />
Кстати, да, библиотека скорее всего использует внутри себя directx. Я не читал ее мануалы подробно, однако на свежеустановленной windows 7 тестовый проект под .net 3.5 сразу заработал. То есть, вывод в том, что на windows xp без установленного direct x, библиотека может не работать. Постараюсь это проверить, и напишу комментарий.<br />
Собственно, код для получения картинки с камеры:</p>
<pre class="brush: csharp">
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics;

using DirectShowLib;
using System.IO;
class OneShot
{
/// &lt;summary&gt;
///log path 1
/// &lt;/summary&gt;
public string logPath = @&quot;c:camlog111.log.txt&quot;;
/// &lt;summary&gt;
/// log for cam class
/// &lt;/summary&gt;
private string log2 = @&quot;c:camlog222.log.txt&quot;;
/// &lt;summary&gt;
/// текущий шот с камеры
/// &lt;/summary&gt;
public Bitmap AcurrShot = null;
/// &lt;summary&gt;
/// main camera class
/// &lt;/summary&gt;
private CaptureCamDx cam = null;
/// &lt;summary&gt;
/// dispose cam
/// &lt;/summary&gt;
public void StopCam()
{
cam.Dispose();
}
/// &lt;summary&gt;
/// zero based index of video capture device to use
/// &lt;/summary&gt;
int VIDEODEVICE = 0;
/// &lt;summary&gt;
/// Depends on video device caps. Generally 4-30.
/// &lt;/summary&gt;
public int FRAMERATE = 10;
/// &lt;summary&gt;
/// Depends on video device caps and on picturebox where we display shots(if any)
/// &lt;/summary&gt;
public int VIDEOWIDTH = 640;
/// &lt;summary&gt;
/// Depends on video device caps and picturebox
/// &lt;/summary&gt;
public int VIDEOHEIGHT = 480;
/// &lt;summary&gt;
/// 1-100 or 0 for default
/// &lt;/summary&gt;
long JPEGQUALITY = 30;
/// &lt;summary&gt;
/// int ptr to image from cam
/// &lt;/summary&gt;
private IntPtr ipp;
/// &lt;summary&gt;
/// inits cam and do ONE shot, save to SavePath
/// &lt;/summary&gt;
public void Initcam(string savePath)
{
try
{
//YouBox = (PictureBox)pictureYou;
//VIDEOWIDTH = YouBox.Width;
//VIDEOHEIGHT = YouBox.Height;

cam = new CaptureCamDx(VIDEODEVICE, FRAMERATE, VIDEOWIDTH, VIDEOHEIGHT);
cam.logpath = log2;
cam.Start();
//wait for initialize cam
//фотки чуть желтые но это пофигу
Thread.Sleep(700);
// capture image
IntPtr ip = cam.GetBitMap();
Bitmap image = new Bitmap(VIDEOWIDTH, VIDEOHEIGHT, cam.Stride, PixelFormat.Format24bppRgb, ip);
image.RotateFlip(RotateFlipType.RotateNoneFlipY);
//image.Save(savePath);

AcurrShot = (Bitmap)image.Clone();

cam.Dispose();
/*
TcpExchange.yourPic = image;
//image scaling to box
Bitmap scale = new Bitmap(image, YouBox.Width, YouBox.Height);
YouBox.Image = scale;

//setting up timer
TimerCallback tb = new TimerCallback(timer1_Tick);
tim = new System.Threading.Timer(tb, null, 0, 1000 / fps);
* */
}
catch (Exception e)
{
//this.TcpExchange.CamAvailable = false;
// this.TcpExchange.commForm.Text += &quot;n maybe no camera!&quot; + e.Message;
}

}
/// &lt;summary&gt;
/// inits cam for video capture
/// &lt;/summary&gt;
public void InitcamNew()
{
try
{
//YouBox = (PictureBox)pictureYou;
//VIDEOWIDTH = YouBox.Width;
//VIDEOHEIGHT = YouBox.Height;

cam = new CaptureCamDx(VIDEODEVICE, FRAMERATE, VIDEOWIDTH, VIDEOHEIGHT);
cam.logpath = log2;
cam.Start();

//comment
/*
Thread.Sleep(700);

ip1 = cam.GetBitMap();
image1 = new Bitmap(VIDEOWIDTH, VIDEOHEIGHT, cam.Stride, PixelFormat.Format24bppRgb, ip1);
image1.RotateFlip(RotateFlipType.RotateNoneFlipY);
_currShot = image1;
_currShot.Save(&quot;c:opopo.jpg&quot;);
* */
/*
TcpExchange.yourPic = image;
//image scaling to box
Bitmap scale = new Bitmap(image, YouBox.Width, YouBox.Height);
YouBox.Image = scale;

//setting up timer
TimerCallback tb = new TimerCallback(timer1_Tick);
tim = new System.Threading.Timer(tb, null, 0, 1000 / fps);
* */
}
catch (Exception e)
{
using (StreamWriter sw = File.AppendText(logPath))
{
sw.WriteLine(&quot;cam init error at &quot; + DateTime.Now.ToString());
sw.WriteLine(e.Message);
}
//this.TcpExchange.CamAvailable = false;
// this.TcpExchange.commForm.Text += &quot;n maybe no camera!&quot; + e.Message;
}

}
/// &lt;summary&gt;
/// stop cam video capture
/// &lt;/summary&gt;
public void stopCam()
{
try
{
cam.Dispose();
}
catch
{ }
}
private IntPtr ip1;
private Bitmap image1;
/// &lt;summary&gt;
/// get new image from cam.
/// it goes to _curshot.
/// &lt;/summary&gt;
public void UpdateImage()
{
try
{
ip1 = cam.GetBitMap();
image1 = new Bitmap(VIDEOWIDTH, VIDEOHEIGHT, cam.Stride, PixelFormat.Format24bppRgb, ip1);
//переворот по вертикуали!
image1.RotateFlip(RotateFlipType.RotateNoneFlipY);

AcurrShot = (Bitmap)image1.Clone();

Marshal.FreeCoTaskMem(ip1);
image1.Dispose();
}
catch (Exception e12)
{
//System.Windows.Forms.MessageBox.Show(e12.Message);
AcurrShot = null;
using (StreamWriter sw = File.AppendText(logPath))
{
sw.WriteLine(e12.Message);
sw.WriteLine(e12.StackTrace);
}

return;
}
}
}

/// &lt;summary&gt;
/// camera class
/// &lt;/summary&gt;
internal class CaptureCamDx : ISampleGrabberCB, IDisposable
{
#region Member variables

/// &lt;summary&gt; graph builder interface. &lt;/summary&gt;
private IFilterGraph2 m_FilterGraph = null;
private IMediaControl m_mediaCtrl = null;

/// &lt;summary&gt; so we can wait for the async job to finish &lt;/summary&gt;
private ManualResetEvent m_PictureReady = null;

/// &lt;summary&gt; Set by async routine when it captures an image &lt;/summary&gt;
private volatile bool m_bGotOne = false;

/// &lt;summary&gt; Indicates the status of the graph &lt;/summary&gt;
private bool m_bRunning = false;

/// &lt;summary&gt; Dimensions of the image, calculated once in constructor. &lt;/summary&gt;
private IntPtr m_handle = IntPtr.Zero;
private int m_videoWidth;
private int m_videoHeight;
private int m_stride;
public int m_Dropped = 0;

#endregion

#region API

[DllImport(&quot;Kernel32.dll&quot;, EntryPoint = &quot;RtlMoveMemory&quot;)]
private static extern void CopyMemory(IntPtr Destination, IntPtr Source, int Length);

#endregion

/// &lt;summary&gt; Use capture device zero, default frame rate and size&lt;/summary&gt;
public CaptureCamDx()
{
_Capture(0, 0, 0, 0);
}
/// &lt;summary&gt; Use specified capture device, default frame rate and size&lt;/summary&gt;
public CaptureCamDx(int iDeviceNum)
{
_Capture(iDeviceNum, 0, 0, 0);
}
/// &lt;summary&gt; Use specified capture device, specified frame rate and default size&lt;/summary&gt;
public CaptureCamDx(int iDeviceNum, int iFrameRate)
{
_Capture(iDeviceNum, iFrameRate, 0, 0);
}
/// &lt;summary&gt; Use specified capture device, specified frame rate and size&lt;/summary&gt;
public CaptureCamDx(int iDeviceNum, int iFrameRate, int iWidth, int iHeight)
{
_Capture(iDeviceNum, iFrameRate, iWidth, iHeight);
}
/// &lt;summary&gt; release everything. &lt;/summary&gt;
public void Dispose()
{
CloseInterfaces();
if (m_PictureReady != null)
{
m_PictureReady.Close();
m_PictureReady = null;
}
}
// Destructor
~CaptureCamDx()
{
Dispose();
}

public int Width
{
get
{
return m_videoWidth;
}
}
public int Height
{
get
{
return m_videoHeight;
}
}
public int Stride
{
get
{
return m_stride;
}
}
//solo
public string logpath = @&quot;c:camlog333.log.txt&quot;;
/// &lt;summary&gt; capture the next image &lt;/summary&gt;
public IntPtr GetBitMap()
{
m_handle = Marshal.AllocCoTaskMem(m_stride * m_videoHeight);

try
{
// get ready to wait for new image
m_PictureReady.Reset();
m_bGotOne = false;

// If the graph hasn&#039;t been started, start it.
Start();

// Start waiting
if (!m_PictureReady.WaitOne(5000, false))
{

throw new Exception(&quot;Timeout waiting to get picture&quot;);
}
}
catch (Exception e)
{
using (StreamWriter sw = File.AppendText(logpath))
{
sw.WriteLine(e.Message);
sw.WriteLine(e.StackTrace);
}
try
{
Marshal.FreeCoTaskMem(m_handle);
}
catch (Exception e1)
{
using (StreamWriter sw = File.AppendText(logpath))
{
sw.WriteLine(e1.Message);
sw.WriteLine(e1.StackTrace);
}
}
throw e;
}

// Got one
return m_handle;

}
// Start the capture graph
public void Start()
{
try
{
if (!m_bRunning)
{
int hr = m_mediaCtrl.Run();
DsError.ThrowExceptionForHR(hr);

m_bRunning = true;

}
}
catch (Exception e)
{
using (StreamWriter sw = File.AppendText(logpath))
{
sw.WriteLine(e.Message);
sw.WriteLine(e.StackTrace);
}
}
}
// Pause the capture graph.
// Running the graph takes up a lot of resources. Pause it when it
// isn&#039;t needed.
public void Pause()
{
if (m_bRunning)
{
int hr = m_mediaCtrl.Pause();
DsError.ThrowExceptionForHR(hr);

m_bRunning = false;
}
}

// Internal capture
private void _Capture(int iDeviceNum, int iFrameRate, int iWidth, int iHeight)
{
DsDevice[] capDevices;

// Get the collection of video devices
capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);

if (iDeviceNum + 1 &gt; capDevices.Length)
{
using (StreamWriter sw = File.AppendText(logpath))
{
sw.WriteLine(&quot;No video capture devices found at that index!&quot;);
//sw.WriteLine(e1.StackTrace);
}
throw new Exception(&quot;No video capture devices found at that index!&quot;);

}

try
{
// Set up the capture graph
SetupGraph(capDevices[iDeviceNum], iFrameRate, iWidth, iHeight);

// tell the callback to ignore new images
m_PictureReady = new ManualResetEvent(false);
m_bGotOne = true;
m_bRunning = false;
}
catch
{
Dispose();
throw;
}
}

/// &lt;summary&gt; build the capture graph for grabber. &lt;/summary&gt;
private void SetupGraph(DsDevice dev, int iFrameRate, int iWidth, int iHeight)
{
int hr;

ISampleGrabber sampGrabber = null;
IBaseFilter capFilter = null;
ICaptureGraphBuilder2 capGraph = null;

// Get the graphbuilder object
m_FilterGraph = (IFilterGraph2)new FilterGraph();
m_mediaCtrl = m_FilterGraph as IMediaControl;
try
{
// Get the ICaptureGraphBuilder2
capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();

// Get the SampleGrabber interface
sampGrabber = (ISampleGrabber)new SampleGrabber();

// Start building the graph
hr = capGraph.SetFiltergraph(m_FilterGraph);
DsError.ThrowExceptionForHR(hr);

// Add the video device
hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, &quot;Video input&quot;, out capFilter);
DsError.ThrowExceptionForHR(hr);

IBaseFilter baseGrabFlt = (IBaseFilter)sampGrabber;
ConfigureSampleGrabber(sampGrabber);

// Add the frame grabber to the graph
hr = m_FilterGraph.AddFilter(baseGrabFlt, &quot;Ds.NET Grabber&quot;);
DsError.ThrowExceptionForHR(hr);

// If any of the default config items are set
if (iFrameRate + iHeight + iWidth &gt; 0)
{
SetConfigParms(capGraph, capFilter, iFrameRate, iWidth, iHeight);
}

hr = capGraph.RenderStream(PinCategory.Capture, MediaType.Video, capFilter, null, baseGrabFlt);
DsError.ThrowExceptionForHR(hr);

SaveSizeInfo(sampGrabber);
}
finally
{
if (capFilter != null)
{
Marshal.ReleaseComObject(capFilter);
capFilter = null;
}
if (sampGrabber != null)
{
Marshal.ReleaseComObject(sampGrabber);
sampGrabber = null;
}
if (capGraph != null)
{
Marshal.ReleaseComObject(capGraph);
capGraph = null;
}
}
}

private void SaveSizeInfo(ISampleGrabber sampGrabber)
{
int hr;

// Get the media type from the SampleGrabber
AMMediaType media = new AMMediaType();
hr = sampGrabber.GetConnectedMediaType(media);
DsError.ThrowExceptionForHR(hr);

if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero))
{
throw new NotSupportedException(&quot;Unknown Grabber Media Format&quot;);
}

// Grab the size info
VideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
m_videoWidth = videoInfoHeader.BmiHeader.Width;
m_videoHeight = videoInfoHeader.BmiHeader.Height;
m_stride = m_videoWidth * (videoInfoHeader.BmiHeader.BitCount / 8);

DsUtils.FreeAMMediaType(media);
media = null;
}
private void ConfigureSampleGrabber(ISampleGrabber sampGrabber)
{
AMMediaType media;
int hr;

// Set the media type to Video/RBG24
media = new AMMediaType();
media.majorType = MediaType.Video;
media.subType = MediaSubType.RGB24;
media.formatType = FormatType.VideoInfo;
hr = sampGrabber.SetMediaType(media);
DsError.ThrowExceptionForHR(hr);

DsUtils.FreeAMMediaType(media);
media = null;

// Configure the samplegrabber
hr = sampGrabber.SetCallback(this, 1);
DsError.ThrowExceptionForHR(hr);
}

// Set the Framerate, and video size
private void SetConfigParms(ICaptureGraphBuilder2 capGraph, IBaseFilter capFilter, int iFrameRate, int iWidth, int iHeight)
{
int hr;
object o;
AMMediaType media;

// Find the stream config interface
hr = capGraph.FindInterface(
PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, out o);

IAMStreamConfig videoStreamConfig = o as IAMStreamConfig;
if (videoStreamConfig == null)
{
throw new Exception(&quot;Failed to get IAMStreamConfig&quot;);
}

// Get the existing format block
hr = videoStreamConfig.GetFormat(out media);
DsError.ThrowExceptionForHR(hr);

// copy out the videoinfoheader
VideoInfoHeader v = new VideoInfoHeader();
Marshal.PtrToStructure(media.formatPtr, v);

// if overriding the framerate, set the frame rate
if (iFrameRate &gt; 0)
{
v.AvgTimePerFrame = 10000000 / iFrameRate;
}

// if overriding the width, set the width
if (iWidth &gt; 0)
{
v.BmiHeader.Width = iWidth;
}

// if overriding the Height, set the Height
if (iHeight &gt; 0)
{
v.BmiHeader.Height = iHeight;
}

// Copy the media structure back
Marshal.StructureToPtr(v, media.formatPtr, false);

// Set the new format
hr = videoStreamConfig.SetFormat(media);
DsError.ThrowExceptionForHR(hr);

DsUtils.FreeAMMediaType(media);
media = null;
}

/// &lt;summary&gt; Shut down capture &lt;/summary&gt;
private void CloseInterfaces()
{
int hr;

try
{
if (m_mediaCtrl != null)
{
// Stop the graph
hr = m_mediaCtrl.Stop();
m_bRunning = false;
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}

if (m_FilterGraph != null)
{
Marshal.ReleaseComObject(m_FilterGraph);
m_FilterGraph = null;
}
}

/// &lt;summary&gt; sample callback, NOT USED. &lt;/summary&gt;
int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample)
{
if (!m_bGotOne)
{
// Set bGotOne to prevent further calls until we
// request a new bitmap.
m_bGotOne = true;
IntPtr pBuffer;

pSample.GetPointer(out pBuffer);
int iBufferLen = pSample.GetSize();

if (pSample.GetSize() &gt; m_stride * m_videoHeight)
{
using (StreamWriter sw = File.AppendText(logpath))
{
sw.WriteLine(&quot;Buffer is wrong size!&quot;);
//sw.WriteLine(e1.StackTrace);
}
throw new Exception(&quot;Buffer is wrong size&quot;);
}

CopyMemory(m_handle, pBuffer, m_stride * m_videoHeight);

// Picture is ready.
m_PictureReady.Set();
}

Marshal.ReleaseComObject(pSample);
return 0;
}

/// &lt;summary&gt; buffer callback, COULD BE FROM FOREIGN THREAD. &lt;/summary&gt;
int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
{
if (!m_bGotOne)
{
// The buffer should be long enought
if (BufferLen &lt; = m_stride * m_videoHeight)
{
// Copy the frame to the buffer
CopyMemory(m_handle, pBuffer, m_stride * m_videoHeight);
}
else
{
using (StreamWriter sw = File.AppendText(logpath))
{
sw.WriteLine(&quot;Buffer is wrong size!&quot;);
//sw.WriteLine(e1.StackTrace);
}
throw new Exception(&quot;Buffer is wrong size&quot;);
}

// Set bGotOne to prevent further calls until we
// request a new bitmap.
m_bGotOne = true;

// Picture is ready.
m_PictureReady.Set();
}
else
{
m_Dropped++;
}
return 0;
}
}
</pre>
<p>Как ни странно, несмотря на небезопасную работу с памятью, код стабильно работает. Главное, не забывать освобождать выделенную с помощью<br />
Marshal.AllocCoTaskMem память, что и сделано в UpdateImage(). Также я еще добавил в таймер принудительный вызов сборщика мусора раз в 10 секунд, и мое приложение потребляет не больше 120-150 мегабайт памяти. Могут возникнуть проблемы с получением картинки либо из-за неработающего драйвера камеры, либо из-за того что у вас номер VIDEODEVICE не 0. Это решается запуском и отладкой примеров, прилагающихся к библиотеке directshowlib 2005 и переносом нового кода в этот класс. Удобно, что все ошибки пишутся в текстовые логи на диск c и их можно проанализировать.</p>
<p>3. Сборка картинок в видео.<br />
Самая сложная часть &#8212; это сборка отснятых картинок в видео. Тут я решил несколько задачек: картинки не сохраняются в виде jpeg на диск, а сразу собираются в avi файл ; видео длится не более одной минуты, чтобы без проблем объединять его с записанным звуком, а также чтоб у него был небольшой размер. Минута видео со звуком в среднем занимает 25-35 мегабайт, также это зависит от кодека сжатия.<br />
Я воспользовался вот этим проектом</p>
<p>http://www.codeproject.com/Articles/7388/A-Simple-C-Wrapper-for-the-AviFile-Library</p>
<p>и взял оттуда часть которая отвечает как раз за объединение картинок в видео.<br />
Самое сложное было подобрать подходящий кодек сжатия, это я делал, запуская имеющийся там пример и пробуя разные варианты в диалоге настроек кодека.<br />
В итоге в методе CreateCompressedStream() класса VideoStream я выбрал кодек microsoft vid1, как стабильно работавший на нескольких протестированных ноутах, и дающий небольшой размер итогового видео.<br />
Все классы AviFile из этого проекта я скомпилировал в dll, который и использовал в своем проекте. Можно также просто копировать классы из файлов .cs .<br />
Суть объединения также очень проста &#8212; отснятые с камеры картинки (bitmap) в таймере сразу отправляются в первый поток видео VideoStream, затем когда проходит минута по таймеру, связанный с первым потоком менеджер AviManager добавляет к видеофайлу звук и сохраняет его на диск, а в это время в таймере собранные картинки отправляются во второй поток и с ними работает второй менеджер. Затем по прошествии еще минуты, они меняются обратно. Таким образом, картинки не занимают место в памяти, объединение их в видео происходит без потерь, при небольшой длительности видео, объединение его с записанным звуком также не занимает много времени.<br />
Код формы приложения, в которой всё и происходит:<br />
[sourcecode language=&#039;csharp&#039;]<br />
public class SimpleCapContext : Form<br />
{<br />
///<br />
<summary>
/// для быстрого задания фпс<br />
///<br />
private class FPS<br />
{<br />
//100-200 ms<br />
public static int timerInterval = 200;<br />
///<br />
<summary>
/// how many ticks in 1 second<br />
/// </summary>
<p>public static int ticksInSecond = 5;<br />
//5-10 fps<br />
public static double fps = 5.000;<br />
public static int videoWidth = 640;<br />
public static int videoHeight = 480;</p>
<p>//intervals<br />
public static int interval1 = 300;//60*fps<br />
public static int interval2 = 301;<br />
public static int interval3 = 302;</p>
<p>}<br />
private OneShot cam = new OneShot();<br />
private WmvClass2 wmvCapture = new WmvClass2();</p>
<p>private bool started = false;<br />
private int ticks = 0;<br />
private object l1 = new object();<br />
private System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();<br />
///<br />
<summary>
/// Constructor. Invokes creation of menu and icon, sets up the hook on termination event.<br />
/// Включаем таймеры, создаем воркеры&#8230;<br />
/// </summary>
<p>public SimpleCapContext()<br />
{<br />
if (!Directory.Exists(@&#187;c:test_cam&#187;))<br />
Directory.CreateDirectory(@&#187;c:test_cam&#187;);<br />
if (!Directory.Exists(@&#187;c:test_camwav&#187;))<br />
Directory.CreateDirectory(@&#187;c:test_camwav&#187;);<br />
if (!Directory.Exists(@&#187;c:test_camavi&#187;))<br />
Directory.CreateDirectory(@&#187;c:test_camavi&#187;);<br />
timer1.Tick += new EventHandler(timer_Tick);</p>
<p>cam.FRAMERATE = Convert.ToInt32(FPS.fps);<br />
cam.VIDEOWIDTH = FPS.videoWidth;<br />
cam.VIDEOHEIGHT = FPS.videoHeight;<br />
timer1.Interval = FPS.timerInterval;<br />
started = true;<br />
cam.InitcamNew();<br />
timer1.Enabled = true;<br />
timer1.Start();<br />
this.ThreadExit += new EventHandler(OnApplicationExit);<br />
}<br />
///<br />
<summary>
/// runs when app is closing<br />
/// </summary>
<p>///<br />
///<br />
private void OnApplicationExit(object sender, EventArgs e)<br />
{<br />
try<br />
{<br />
//newManager.Close();<br />
wmvCapture.StopF();<br />
timer1.Stop();<br />
//&gt;305<br />
ticks = 999;<br />
vidstop = true;<br />
foreach (var item in curImages)<br />
{<br />
File.Delete(item);</p>
<p>}<br />
curImages.Clear();</p>
<p>}<br />
catch<br />
{ }<br />
}<br />
private Bitmap AcurImage = null;<br />
bool once1 = false;<br />
List threads = new List();<br />
private string curWav = &#171;&#187;;<br />
List curImages = new List();<br />
///<br />
<summary>
/// to keep in order!!!<br />
/// </summary>
<p>List images = new List();<br />
List images2 = new List();<br />
bool images1Use = true;<br />
int filmedVideos = 0;<br />
//bool images2Use = false;<br />
AviManager mmm;<br />
VideoStream nnn;<br />
AviManager mmm1;<br />
VideoStream nnn1;<br />
private string oldAviPath = &#171;&#187;;<br />
private string oldWavPath = &#171;&#187;;<br />
private string curAviPath = &#171;&#187;;<br />
Bitmap local444=null;<br />
string date4 = &#171;&#187;;<br />
string date111 = &#171;&#187;;<br />
private string form1log = @&#187;C:f1.log_work.log.txt&#187;;<br />
private void timer_Tick(object sender, EventArgs e)<br />
{</p>
<p>if (started)<br />
{<br />
if ( (this.ticks % (FPS.ticksInSecond*5) ) == 0)<br />
{<br />
using (StreamWriter writer = File.CreateText(this.form1log))<br />
{<br />
writer.WriteLine(&#171;cam work now;&#187; + DateTime.Now.ToString() + &#171;;&#187;);<br />
}<br />
}<br />
ticks++;<br />
if (ticks == FPS.interval2)<br />
{<br />
//vidstop = true;<br />
}</p>
<p>if (ticks == FPS.interval3)<br />
{<br />
try<br />
{</p>
<p>//Application.Exit();<br />
//Application.ExitThread();</p>
<p>try<br />
{<br />
wmvCapture.StopF();<br />
}<br />
catch { }</p>
<p>curImages.Sort();</p>
<p>//thread for join jpg to avi<br />
//важно &#8212; если это объединение занимает больше минуты то пипец<br />
//потому что новое будет объединять еще не удаленные первым файлы &#8212; нагрузка</p>
<p>InfoJoinJpg inf = new InfoJoinJpg();<br />
//WRONG inf.inner = sorted;<br />
foreach (var item in curImages)<br />
{<br />
inf.inner.Add(item);<br />
}</p>
<p>if (images1Use)<br />
{<br />
this.oldAviPath = this.curAviPath;<br />
this.oldWavPath = this.curWav;<br />
Thread thread = new Thread(new ParameterizedThreadStart(this.joinJpgToAvi2))<br />
{<br />
Name = &#171;join&#187; + DateTime.Now.ToString()<br />
};<br />
thread.Start(this.mmm);<br />
this.threads.Add(thread);<br />
/*<br />
foreach (var item in images)<br />
{<br />
inf.imgList.Add(item);</p>
<p>}<br />
*/<br />
}<br />
else<br />
{<br />
this.oldAviPath = this.curAviPath;<br />
this.oldWavPath = this.curWav;<br />
Thread thread = new Thread(new ParameterizedThreadStart(this.joinJpgToAvi2))<br />
{<br />
Name = &#171;join&#187; + DateTime.Now.ToString()<br />
};<br />
thread.Start(this.mmm1);<br />
this.threads.Add(thread);</p>
<p>}<br />
/*<br />
inf.inner.Sort();<br />
inf.curwav = curWav;<br />
//70 ticks about 20secs!!<br />
Thread thh = new Thread(new ParameterizedThreadStart(this.joinJpgToAvi));<br />
thh.Name = &#171;join&#187;+DateTime.Now.ToString();<br />
thh.Start(inf);<br />
threads.Add(thh);<br />
*/<br />
//reset timer</p>
<p>//save avi<br />
//mmm.Close();</p>
<p>ticks = 0;<br />
once1 = false;<br />
//vidstop = false;<br />
curImages.Clear();</p>
<p>if (images1Use)<br />
{<br />
images2.Clear();<br />
images1Use = false;<br />
}<br />
else<br />
{<br />
images.Clear();<br />
images1Use = true;</p>
<p>}</p>
<p>//label5.Text = &#171;join launched in progress, look at c:test_webcam&#187;;<br />
filmedVideos++;<br />
//Application.Exit();<br />
//MessageBox.Show(&#171;finish img&#187;);</p>
<p>}<br />
catch (Exception e12)<br />
{</p>
<p>}<br />
//vidstop = true;</p>
<p>}</p>
<p>if (ticks % (FPS.ticksInSecond*5) == 0)<br />
{<br />
GC.Collect();</p>
<p>}</p>
<p>try<br />
{<br />
cam.UpdateImage();<br />
AcurImage = (Bitmap)cam.AcurrShot.Clone();</p>
<p>//сохраняем кадр каждые 1 сек для test<br />
if ( ticks % (FPS.ticksInSecond) == 0)<br />
{<br />
try<br />
{<br />
AcurImage.Save(@&#187;c:test_camvidshot.jpg&#187;);<br />
}<br />
catch<br />
{</p>
<p>}</p>
<p>}</p>
<p>if (!once1)<br />
{<br />
once1 = true;<br />
//newStream = newManager.AddVideoStream(true, 1.750, AcurImage);<br />
//start wmv<br />
date111 = DateTime.Now.ToString(&#171;s&#187;);<br />
date111 = date111.Replace(&#171;-&#187;, &#171;_&#187;);<br />
date111 = date111.Replace(&#171;:&#187;, &#171;_&#187;);<br />
date111 = date111.Replace(&#171;T&#187;, &#171;_&#187;);<br />
//date = date + &#171;_&#187; + DateTime.Now.Millisecond.ToString();<br />
wmvCapture.StartF(@&#187;c:test_camwav&#187;+&#187;wav_&#187;+date111+&#187;.wav&#187;);<br />
curWav = cam.wmvPath + &#171;wav_&#187; + date111 + &#171;.wav&#187;;</p>
<p>if (this.images1Use)<br />
{<br />
this.mmm = new AviManager(@&#187;c:test_camavi&#187; + &#171;avi_&#187; + date111 + &#171;.avi&#187;, false);<br />
this.curAviPath = this.cam.aviPath + &#171;avi_&#187; + date111 + &#171;.avi&#187;;<br />
Bitmap bitmap = (Bitmap)this.AcurImage.Clone();<br />
this.nnn = this.mmm.AddVideoStream(true, FPS.fps, bitmap);<br />
}<br />
else<br />
{<br />
this.mmm1 = new AviManager(@&#187;c:test_cam&#187; + &#171;avi_&#187; + date111 + &#171;.avi&#187;, false);<br />
this.curAviPath = this.cam.aviPath + &#171;avi_&#187; + date111 + &#171;.avi&#187;;<br />
Bitmap bitmap = (Bitmap)this.AcurImage.Clone();<br />
this.nnn1 = this.mmm1.AddVideoStream(true, FPS.fps, bitmap);<br />
}</p>
<p>}</p>
<p>if (ticks &lt; FPS.interval1)<br />
{</p>
<p>//picturebox1.Image = local444;<br />
//reference type!!!</p>
<p>local444 = (Bitmap)AcurImage.Clone();<br />
if (this.images1Use)<br />
{<br />
this.nnn.AddFrame(local444);<br />
}<br />
else<br />
{<br />
this.nnn1.AddFrame(local444);<br />
}</p>
<p>}</p>
<p>}<br />
catch (Exception e12)<br />
{</p>
<p>//MessageBox.Show(e12.Message + e12.StackTrace);<br />
AcurImage = null;<br />
}</p>
<p>}</p>
<p>}<br />
class InfoJoinJpg<br />
{<br />
public List imgList = new List();<br />
public List inner = new List();<br />
public InfoJoinJpg() { }<br />
public string curwav = &#171;&#187;;<br />
public string curFileJpg = &#171;&#187;;<br />
}<br />
///<br />
<summary>
/// просто подсоединяем WAV из this.oldWavPath к менеджеру из параметра<br />
/// </summary>
<p>/// AviManager<br />
private void joinJpgToAvi2(object state)<br />
{<br />
string oldAviPath = this.oldAviPath;<br />
AviManager manager = (AviManager)state;<br />
try<br />
{<br />
if (File.Exists(this.oldWavPath))<br />
{<br />
manager.AddAudioStream(this.oldWavPath, 0);<br />
}<br />
}<br />
catch (Exception exception)<br />
{<br />
using (StreamWriter writer = File.AppendText(&#171;join.log&#187;))<br />
{<br />
writer.WriteLine(exception.Message);<br />
writer.WriteLine(exception.StackTrace);<br />
}<br />
}<br />
manager.Close();<br />
}<br />
///<br />
<summary>
/// join jpg list to avi video<br />
/// </summary>
<p>///<br />
private void joinJpgToAvi(object state)<br />
{<br />
string date = DateTime.Now.ToString(&#171;s&#187;);<br />
date = date.Replace(&#171;-&#187;, &#171;_&#187;);<br />
date = date.Replace(&#171;:&#187;, &#171;_&#187;);<br />
date = date.Replace(&#171;T&#187;, &#171;_&#187;);<br />
date = date + &#171;_&#187; + DateTime.Now.Millisecond.ToString();</p>
<p>newManager = new AviManager(cam.aviPath + &#171;avi_&#187; + date + &#171;.avi&#187;, false);<br />
curAviPath = cam.aviPath + &#171;avi_&#187; + date + &#171;.avi&#187;;</p>
<p>//string[] files = Directory.GetFiles(OneShot.imgPath, &#171;*.jpg&#187;);<br />
InfoJoinJpg loc1 = (InfoJoinJpg)state;<br />
List sorted = new List();<br />
sorted = loc1.inner;<br />
List soImg = new List();<br />
soImg = loc1.imgList;</p>
<p>//Bitmap o1 = (Bitmap)Image.FromFile(sorted[0]);<br />
//newStream = newManager.AddVideoStream(true, 5.000, o1);<br />
newStream = newManager.AddVideoStream(true, FPS.fps, soImg[0]);<br />
/*<br />
for (int i = 1; i &lt; sorted.Count; i++)<br />
{<br />
o1 = (Bitmap)Bitmap.FromFile(sorted[i]);<br />
if (o1 != null)<br />
{<br />
//newStream.AddFrame(o1);<br />
//o1.Dispose();<br />
}<br />
//cleaning&#8230;<br />
try<br />
{<br />
File.Delete(sorted[i]);<br />
}<br />
catch { }<br />
}<br />
File.Delete(sorted[0]);<br />
*/<br />
for (int j = 1; j &lt; soImg.Count; j++)<br />
{<br />
if (soImg[j] != null)<br />
{<br />
newStream.AddFrame(soImg[j]);<br />
}<br />
}</p>
<p>//adding wav<br />
//может не работать корректно и удлинять видео на 10 секунд<br />
if (File.Exists(loc1.curwav))<br />
{<br />
newManager.AddAudioStream(loc1.curwav, 0);<br />
}</p>
<p>newManager.Close();<br />
soImg.Clear();<br />
loc1 = null;<br />
//MessageBox.Show(&quot;avi created&quot;);<br />
}</p>
<p>}<br />
[/sourcecode]<br />
Собственно, тут в таймере как раз происходит управление съемкой видео и записью звука. Код, конечно, не самый оптимальный, зато работает.<br />
Если есть вопросы, пишите пожалуйста в комментарии!</p>
<p>Библиотеки DirectShowLib, Naudio, Avifile можно скачать по ссылке: <a href="http://narod.ru/disk/45870791001.6a609a05f051cbdf8e2870e077292b8c/vr-online.rar.html">vr-online.rar
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/">rosomakho.ru</a></li>
<li><a href="http://rosomakho.ru/blog/mvc-cms-2-0/">cms mvc</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">c# зависает форма</a></li>
<li><a href="http://rosomakho.ru/proj_prof/csharp-zapisyvaem-video-i-zvuk-s-web-kamery/">c# запись видео из картинок</a></li>
<li><a href="http://rosomakho.ru/tag/opencart/">как сделать тему opencart</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">уроки opencart</a></li>
<li><a href="http://blogclient.ru/">Клиент для комментариев WordPress</a></li>
</ul>
<p></a></p>
<div class="shr-publisher-2008"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/proj_prof/csharp-zapisyvaem-video-i-zvuk-s-web-kamery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чем я сейчас занимаюсь</title>
		<link>http://rosomakho.ru/proj_prof/chem-ya-sejchas-zanimayus/</link>
		<comments>http://rosomakho.ru/proj_prof/chem-ya-sejchas-zanimayus/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 12:32:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[Проекты Вани]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[работа]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=1970</guid>
		<description><![CDATA[Так сложилось, что я достаточно давно не навещал свой сайт. За это время много чего произошло: я окончательно выучился печатать вслепую десятью пальцами, нашел работу и собираюсь жениться. Работаю я теперь в 1с-рарус, занимаюсь по большей части доработкой 1с-ЗУП под 8.2. Также получил сертификат по 1с управлению торговлей 11 редакции, в чём мне очень помог [...]]]></description>
			<content:encoded><![CDATA[<p>Так сложилось, что я достаточно давно не навещал свой сайт. За это время много чего произошло: я окончательно выучился печатать вслепую десятью пальцами, нашел работу и собираюсь жениться. Работаю я теперь в 1с-рарус, занимаюсь по большей части доработкой 1с-ЗУП под 8.2. Также получил сертификат по 1с управлению торговлей 11 редакции, в чём мне очень помог форум http://chistov.spb.ru/forum/26<br />
Иногда меня по-прежнему просят помочь по opencart, однако я больше не уделяю времени php, но тем не менее стараюсь отвечать на ваши вопросы!<br />
Сайт я пожалуй не заброшу, буду сюда писать про то чем занимаюсь помимо работы:<br />
программирование на c#. Из ближайших тем собираюсь рассмотреть работу с вебкамерой и запись с нее видео, переписать старый курсовой проект &#8212; mp3 плеер на delphi, рассмотреть взаймодействие c# и mssql а также паттерны проектирования и их применение в моих любительских проектах.</p>
<p>PS Нужно найти нормально работающую капчу для wordpress, а то уже накопилось около 1500 спам-комментариев.<br />
И некоторые плагины слетели из-за обновления.
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">установка opencart на локальный компьютер</a></li>
<li><a href="http://rosomakho.ru/blog/ustanovka-mysql-i-joomla-na-windows-server/">ставим joomla на ngnix</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart видеоуроки</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart как создать модуль</a></li>
<li><a href="http://rosomakho.ru/">сайты c# программирование</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">c# Как передать файл на другой компьютер</a></li>
</ul>
<div class="shr-publisher-1970"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/proj_prof/chem-ya-sejchas-zanimayus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Opencart инструкция &#8212; видеоуроки</title>
		<link>http://rosomakho.ru/blog/opencart-instrukciya-videouroki/</link>
		<comments>http://rosomakho.ru/blog/opencart-instrukciya-videouroki/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 08:54:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[ope]]></category>
		<category><![CDATA[opencart]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=1043</guid>
		<description><![CDATA[Я постарался сделать инструкцию по opencart  и ocstore в формате видеоуроков. Рассмотрены основные возможности работы с магазинами, в процессе создан фактически работающий магазин по адресу php.rosomakho.ru с примерами товаров. Основные рассмотренные темы: Введение и преимущества OpenCart для создания интернет-магазина. Установка OcStore (русская версия OpenCart) на локальном компьютере на сервер xampp. (можно также использовать Денвер) Что [...]]]></description>
			<content:encoded><![CDATA[<p>Я постарался сделать инструкцию по opencart  и ocstore в формате видеоуроков. Рассмотрены основные возможности работы с магазинами, в процессе создан фактически работающий магазин по адресу <a title="ocart магазин" href="http://php.rosomakho.ru" target="_blank">php.rosomakho.ru</a> с примерами товаров.</p>
<p><span id="more-1043"></span></p>
<p>Основные рассмотренные темы:</p>
<ol>
<li>Введение и преимущества OpenCart для создания интернет-магазина.</li>
<li>Установка OcStore (русская версия OpenCart) на локальном компьютере на сервер xampp. (можно также использовать Денвер)</li>
<li>Что видит пользователь в только что установленном интернет-магазине. категории, товары, оформление заказа с личным кабинетом и без.</li>
<li>Самый большой раздел &#8212; администрирование магазина. Настройки магазина,<br />
Разбор пунктов меню каталог: категории товары производители отзывы статьи.<br />
добавление категории и товара, добавление производителя, работа с отзывами и статьями. Рассмотрение модулей доставки по умолчанию. Учет в заказе и каналы товаров. Пользователи, локализация, отчет ошибок, бекап-восстановление<br />
создание пользователя-менеджера. Как работают отчеты. Это пожалуй самый большой и важный раздел моей инструкции по OpenCart и он помогает разобраться в администрировании интернет-магазина.</li>
<li>Установка и подробный разбор использования модуля экспорта-импорта. Установка и разбор использования модуля новостей.<br />
Вывод новостей с увеличивающимися фотографиями как у товаров.<br />
Вывод новостей как модуля.</li>
<li>Где в OpenCart хранится html код и как его менять.<br />
Замена текста доставки, заголовков модулей.</li>
<li>Установка OpenCart на хостинг. Перенос базы данных. Смотрите работающий магазин по адресу <a title="ocart магазин" href="http://php.rosomakho.ru/" target="_blank">php.rosomakho.ru</a></li>
<li>Подведение итогов.<br />
Будущие видеоуроки:для магазина-настроить е-мейл и системы оплаты.</li>
</ol>
<p><strong>Модуль новостей</strong> с переведенной инструкцией и <strong>модуль экспорта-импорта</strong> можно скачать <a title="загрузка модулей opencart" href="http://narod.ru/disk/4492261001/modules-downloads.rar.html" target="_blank">здесь</a>.</p>
<p>Это мой первый опыт в создании видеоуроков поэтому качество может быть не всегда хорошим. Пишите ваши замечания.</p>
<p>Итак, все видеоуроки <strong>совершенно бесплатно</strong> можно скачать,заполнив форму. Ссылка придет вам на e-mail.</p>
<p><span style="font-size:36px"><a title="opencart уроки" href="http://rutracker.org/forum/viewtopic.php?t=3395876" target="_blank">Прямая ссылка на скачку</a></span></p>
<p>Если вдруг захотите поблагодарить бедного студента &#8212; Webmoney R338858196046 Яндекс-деньги 41001653071063.</p>
<p>В скором времени планируется выпуск еще многих мини-видеоуроков по работе с OpenCart и OcStore. Инструкции в них помогут вам полностью разобраться с Вашим интернет-магазином. <strong>Пишите в комментариях</strong> что вы хотели бы еще в них увидеть.</p>
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/mvc-cms-2-0/">mvc cms php</a></li>
<li><a href="http://rosomakho.ru/">rosomakho</a></li>
<li><a href="http://rosomakho.ru/blog/chto-delat-letom/">что делать летом</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart модули доставки</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">создание модуля для opencart</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">передача файла по TCP в C#</a></li>
</ul>
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">видеоуроки по opencart</a></li>
<li><a href="http://rosomakho.ru/proj_prof/csharp-zapisyvaem-video-i-zvuk-s-web-kamery/">получить изображение с веб-камеры c#</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart создать модуль</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">модули по качеству фотографиям в opencart</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">видио руководства по настройке opencart</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">передача файлов через сокет c sharp</a></li>
</ul>
<div class="shr-publisher-1043"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/blog/opencart-instrukciya-videouroki/feed/</wfw:commentRss>
		<slash:comments>286</slash:comments>
		</item>
		<item>
		<title>C# передача файла</title>
		<link>http://rosomakho.ru/blog/c-sharp-peredacha-fajla/</link>
		<comments>http://rosomakho.ru/blog/c-sharp-peredacha-fajla/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 20:19:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=1031</guid>
		<description><![CDATA[В данной статье я собираюсь рассмотреть передачу файлов по сети, используя язык c# и возможности платформы .net Демонстрационная программа по передаче файлов на c# Краткая инструкция по передаче файлов на c# Распакуйте архив, зайдите в папку filetransfer/bin/debug/ и запустите filetransfer.exe ДВА раза. Один будет для приема, другой для передачи(то есть, в одном окне с главной [...]]]></description>
			<content:encoded><![CDATA[<p>В данной статье я собираюсь рассмотреть <strong>передачу файлов по сети, используя язык c#</strong> и возможности платформы .net</p>
<p><span id="more-1031"></span> <a href="http://rosomakho.ru/FileTransfer_original.rar">Демонстрационная программа по передаче файлов на c#</a></p>
<p><strong>Краткая инструкция по передаче файлов на c#</strong></p>
<p>Распакуйте архив, зайдите в папку filetransfer/bin/debug/ и запустите filetransfer.exe <strong>ДВА</strong> раза. Один будет для приема, другой для передачи(то есть, в одном окне с  главной формы нажмите Send а в другом Receive) . В том, что для приема выберите папку (например c:received) и нажмите wait receive. Затем в том, что для передачи введите в hostname 127.0.0.1 и выберите файл для передачи и нажмите Send. Файл должен &#171;передаться&#187; и появиться в папке  c:received под тем же именем. Если есть возможность, попробуйте на  разных компьютерах. Узнайте ip принимающего компьютера на 2ip.ru и  введите его в поле hostname окна для передачи.</p>
<p><strong>Более подробно о том, как работает механизм передачи файлов.</strong></p>
<p>Если рассмотреть вкратце возможности передачи файлов, то самые используемые для передачи именно с компьютера на компьютер &#8212; протоколы tcp и udp. Первый гарантирует доставку пакетов, а второй обладает чуть большей скоростью. В демонстрационной программе используется именно tcp протокол а также механизм сокетов.</p>
<p>Рассмотрим работу формы, <strong>посылающей данные и файлы на c#</strong>(SendForm). На ней есть поля для ввода ip адреса получателя (для тестирования попробуйте 127.0.0.1) и выбор файла для отправки. После того, как вы введете все данные, можно нажать кнопку Send и, если на нужном ip работает форма, ожидающая приема данных, произойдет отправка. При отправке производится вызов функции sendBackgroundWorker.RunWorkerAsync в которую передаются параметры &#8212; ip получателя и путь к отправляемому файлу.</p>
<p>Если вы не работали с BackgroundWorker &#8212; вот цитата из Msdn &#171;Класс BackgroundWorker позволяет выполнить операцию в отдельном, выделенном потоке. Операции, требующие много времени, такие как загрузка и транзакции базы данных, могут создавать впечатление, что пользовательский интерфейс перестал отвечать на действия пользователя. Если необходимо обеспечить быстрое реагирование пользовательского интерфейса, а подобные операции приводят к длительным задержкам, эффективным решением может стать класс BackgroundWorker.&#187; Проще говоря, он нужен чтобы в фоновом режиме осуществлять длительные операции и не давать зависать форме(интерфейсу). Функция BackgroundWorker.CancelAsync() которая также присутствует у этой формы, позволяет отменить слишком длительную операцию, для этого в коде отправки и присутствуют строки</p>
<pre class="brush: csharp">
 if (sendBackgroundWorker.CancellationPending)
{
e.Cancel = true;
break;
}</pre>
<p>Как же собственно происходит отправка и <strong>передача файлов</strong>?  В c# для этого используются классы TcpClient и NetworkStream. Мы создаем соединение с получателем, используя его ip и определенный порт (в примере 20000)</p>
<pre class="brush: csharp">TcpClient client =
new TcpClient(argumen.Hostname, 20000);</pre>
<p>Затем открываем наш файл на чтение  и запрашиваем у получателя поток, в который собственно и будем писать данные из файла. Чтобы передать файлы любых форматов используется класс BinaryWriter , который позволяет нам писать в поток двоичные данные. Сначала мы пишем в наш поток имя файла и его размер(длину в байтах).</p>
<pre class="brush: csharp">writer.Write(Path.GetFileName(argumen.Filename));
writer.Write(lenght);</pre>
<p>Затем идет собственно сама передача в цикле.</p>
<pre class="brush: csharp">do {

readBytes = inputStream.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, readBytes);
totalBytes += readBytes;

} while (client.Connected &amp;&amp; totalBytes &lt; lenght);
</pre>
<p>Здесь мы читаем по 2048 байт из файла, пишем их в выходной поток (тот, который запросили у получателя) и делаем это до тех пор, пока не отправим весь файл или пока не отсоединимся от получателя (ну если вдруг компьютер получателя вырубится)</p>
<p>Далее рассмотрим работу формы, принимающей данные. Мы задаем папку для приема и затем запускается так называемая прослушка порта для приема (порт 20000 в нашем случае).<br />
[sourcecode language=&#039;csharp&#039;]<br />
TcpListener listener = new TcpListener(IPAddress.Any, 20000);<br />
listener.Start();</p>
<p>while (!listener.Pending())<br />
{<br />
/*это необязательный код для отмены прослушки</p>
<p>if (receiveBackgroundWorker.CancellationPending)<br />
{<br />
listener.Stop();<br />
e.Cancel = true;<br />
return;<br />
}</p>
<p>*/</p>
<p>}<br />
[/sourcecode]<br />
То есть TcpListener слушает порт и пока кто-то не подключится крутится в вечном цикле. Далее как только кто-то подключился мы создаем для него TcpClient и начинаем прием файла.</p>
<p>[sourcecode language=&#039;csharp&#039;]TcpClient client = listener.AcceptTcpClient();</p>
<p>using (NetworkStream inputStream = client.GetStream())<br />
using (BinaryReader reader = new BinaryReader(inputStream))<br />
{<br />
string filename = reader.ReadString();<br />
long lenght = reader.ReadInt64();</p>
<p>using (FileStream outputStream = File.Open(Path.Combine(folder, filename), FileMode.Create))<br />
{<br />
long totalBytes = 0;<br />
int readBytes = 0;<br />
byte[] buffer = new byte[2048];</p>
<p>do<br />
{<br />
readBytes = inputStream.Read(buffer, 0, buffer.Length);<br />
outputStream.Write(buffer, 0, readBytes);<br />
totalBytes += readBytes;</p>
<p>receiveBackgroundWorker.ReportProgress(<br />
(int)Math.Round(Convert.ToDouble(totalBytes) / Convert.ToDouble(lenght) * 100));</p>
<p>if (receiveBackgroundWorker.CancellationPending)<br />
{<br />
e.Cancel = true;<br />
break;<br />
}</p>
<p>} while (client.Connected &amp;&amp; totalBytes &lt; lenght);<br />
}<br />
}<br />
[/sourcecode]<br />
Здесь мы запрашиваем у клиента входной поток (в который он пишет данные из передаваемого файла), затем читаем из потока имя и длину файла и создаем файл с таким же именем в папке для приема. Ну и также читаем из потока по 2048 байт и сохраняем их в наш файл.</p>
<p>Если есть вопросы по этой теме, пишите в комментариях)
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">c# архивирование передача потока</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart модуль новостей</a></li>
<li><a href="http://rosomakho.ru/blog/mvc-cms-2-0/">mvc cms php</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">протокол передачи файлов на c#</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart документация</a></li>
<li><a href="http://rosomakho.ru/proj_prof/opencart-instrukciya-plan/">opencart документация</a></li>
</ul>
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart как создать модуль</a></li>
<li><a href="http://rosomakho.ru/tag/opencart/">структура opencart</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart документация скачать</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">отзывы opencart</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">инструкция по установке opencart</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">видеоуроки opencart</a></li>
</ul>
<div class="shr-publisher-1031"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/blog/c-sharp-peredacha-fajla/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>Установка mysql,nginx и joomla на windows server</title>
		<link>http://rosomakho.ru/blog/ustanovka-mysql-i-joomla-na-windows-server/</link>
		<comments>http://rosomakho.ru/blog/ustanovka-mysql-i-joomla-na-windows-server/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 19:07:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows server]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=1027</guid>
		<description><![CDATA[Установка mysql с помощью руководства прошла гораздо более спокойно. В принципе после нее на apache и php можно ставить joomla, но я во-первых хотел чтобы паралллельно работал еще и iis а во-вторых чтобы все работало быстро. поэтому поставил еще и nginx под виндовз. Теперь все выглядит так:на роутер со статическим адресом приходят запросы (в dns [...]]]></description>
			<content:encoded><![CDATA[<p>Установка mysql <a href="http://www.codenet.ru/webmast/apache/Apache2-PHP5-MySql5">с помощью руководства</a> прошла гораздо более спокойно. В принципе после нее на apache и php можно ставить joomla, но я во-первых хотел чтобы паралллельно работал еще и iis а во-вторых чтобы все работало быстро. поэтому поставил еще и nginx под виндовз.<br />
<span id="more-1027"></span><br />
Теперь все выглядит так:на роутер со статическим адресом приходят запросы (в dns masterhost записано соответствие сайтов http://phptest.rosomakho.ru и http://aspnet.rosomakho.ru этому статическому ip), роутер перенаправляет их на локальный комп 192.168.1.2 (сервер), а там быстрый nginx в зависимости от сайта (aspnet или phptest) раскидывает их на apache или iis 7, которые висят на портах 8080 и 50000. но для конечных пользователей это незаметно))<br />
Конфиг nginx:<br />
server {<br />
        listen       80;<br />
        server_name  localhost;</p>
<p>        #charset koi8-r;</p>
<p>        #access_log  logs/host.access.log  main;</p>
<p>        location / {<br />
            root   html;<br />
            index  index.html index.htm;<br />
        }</p>
<p>        #error_page  404              /404.html;</p>
<p>        # redirect server error pages to the static page /50x.html<br />
        #<br />
        error_page   500 502 503 504  /50x.html;<br />
        location = /50x.html {<br />
            root   html;<br />
        }</p>
<p>        # proxy the PHP scripts to Apache listening on 127.0.0.1:80<br />
        #<br />
        #location ~ .php$ {<br />
        #    proxy_pass   http://127.0.0.1;<br />
        #}</p>
<p>        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000<br />
        #<br />
        #location ~ .php$ {<br />
        #    root           html;<br />
        #    fastcgi_pass   127.0.0.1:9000;<br />
        #    fastcgi_index  index.php;<br />
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;<br />
        #    include        fastcgi_params;<br />
        #}</p>
<p>        # deny access to .htaccess files, if Apache&#8217;s document root<br />
        # concurs with nginx&#8217;s one<br />
        #<br />
        #location ~ /.ht {<br />
        #    deny  all;<br />
        #}<br />
    }<br />
	server {<br />
	listen  192.168.1.2;<br />
	server_name aspnet.rosomakho.ru  www.aspnet.rosomakho.ru;<br />
	location /<br />
	{<br />
           proxy_pass   http://127.0.0.1:50000;<br />
    }</p>
<p>	}<br />
	server {<br />
	listen  192.168.1.2;<br />
	server_name phptest.rosomakho.ru  www.phptest.rosomakho.ru;<br />
	location /<br />
	{<br />
           proxy_pass   http://127.0.0.1:8080;<br />
    }</p>
<p>	}</p>
<p>    # another virtual host using mix of IP-, name-, and port-based configuration<br />
    #</p>
<p>    # HTTPS server<br />
    #<br />
    #server {<br />
    #    listen       443;<br />
    #    server_name  localhost;</p>
<p>    #    ssl                  on;<br />
    #    ssl_certificate      cert.pem;<br />
    #    ssl_certificate_key  cert.key;</p>
<p>    #    ssl_session_timeout  5m;</p>
<p>    #    ssl_protocols  SSLv2 SSLv3 TLSv1;<br />
    #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;<br />
    #    ssl_prefer_server_ciphers   on;</p>
<p>    #    location / {<br />
    #        root   html;<br />
    #        index  index.html index.htm;<br />
    #    }<br />
    #}<br />
}</p>
<p>То есть сначала все запросы на 80 порт обрабатывает nginx, естественно нужно потом еще включить всякие плюшки nginx вроде ускорения и кеширования, о которых я пока имею самое общее представление.<br />
Теперь по адресу <a href="http://phptest.rosomakho.ru">phptest.rosomakho.ru</a> висит джумла рабочая, а запросы на<br />
<a href="http://aspnet.rosomakho.ru">aspnet.rosomakho.ru</a> обрабатывает iis.<br />
Правда в джумле есть некритичная <a href="http://joomlaforum.ru/index.php/topic,142599.msg776490.html#msg776490">проблема с ссылками</a>, описанная здесь.<br />
Следующие шаги:<br />
-написать тестовое приложение для iis, связывающееся с бд.<br />
-Сконфигурировать nginx для быстрой работы</p>
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">c# сокеты передача файлов</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart создать модуль доставки</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">как настроить opencart</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">ASP NET + передача файла по http</a></li>
<li><a href="http://rosomakho.ru/blog/chto-delat-letom/">что делать летом репетитору</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">инструкция по opencart</a></li>
</ul>
<div class="shr-publisher-1027"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/blog/ustanovka-mysql-i-joomla-na-windows-server/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Установка PHP под Apache в Windows server 2008</title>
		<link>http://rosomakho.ru/proj_prof/ustanovka-php-pod-apache-v-windows-server-2008/</link>
		<comments>http://rosomakho.ru/proj_prof/ustanovka-php-pod-apache-v-windows-server-2008/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 16:30:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Проекты Вани]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows server]]></category>
		<category><![CDATA[работа]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=1013</guid>
		<description><![CDATA[Установить php даже как cgi, а не как модуль у меня получилось не сразу. Вот раздел httpd.conf который в конце концов заработал ]]></description>
			<content:encoded><![CDATA[<p>В общем я собрался ставить дома сервачок. Скачал с дримспарка Виндовс и понеслась) Здесь я собираюсь рассмотреть особенность установки на него PHP.</p>
<p>Нам понадобятся:</p>
<p>-Apache 2.0.xx</p>
<p>-Php (я скачал 5.2.15 VC6 x86 Non Thread Safe zip архив с http://windows.php.net/download/ )<br />
-Статический ip адрес для разворачивания своего сервера или сайта. (Как его получить узнайте у провайдера)<br />
<span id="more-1013"></span></p>
<p>Руководство по установке я нагуглил <a href="http://www.codenet.ru/webmast/apache/Apache2-PHP5-MySql5/">остюда</a> . Сначала не прочитал внимательно и скачал apache не 2.0.хх а 2.2 и поэтому долго не мог настроить под него php. Позже в процессе гугленья нашел какую-то тему (на английском, естественно) где говорилось что под windows нельзя совместить php и apache 2.2. Что ж, снес апач и поставил заново версию 2.0.<br />
В процессе установки апача смело выбирайте пункт for all users on port 80 &#8212; несмотря на то, что там по умолчанию работает iis, позже можно будет поменять порт на другой, например 8080.<br />
Если у вас нет доменного имени, но вы хотите развернуть свой домашний сервер на статическом ip , пишите в network domain и server name &#8212; localhost.<br />
После установки apache нужно будет поменять кое-что в httpd.conf &#8212; по сравнению с руководством <a href="http://www.codenet.ru/webmast/apache/Apache2-PHP5-MySql5/">здесь</a> , изменим порт , прописав Listen 8080 (а на 80м порту останется висеть iis) ну и еще включив кодировкой UTF-8 &#8212; AddDefaultCharset UTF-8 , сколько ж можно сидеть на 1251 или на кои-8 )))</p>
<p>Затем распаковываем архив с php (я распаковал в c:php)<br />
Установить php даже как cgi, а не как модуль у меня получилось не сразу. Вот раздел httpd.conf который в конце концов заработал<br />
#включаем php как cgi<br />
AddType application/x-httpd-php .phtml .php</p>
<p>Options ExecCGI</p>
<p>ScriptAlias &#171;/_php_dir/&#187; &#171;c:/php/&#187;<br />
Action application/x-httpd-php &#171;/_php_dir/php-cgi.exe&#187;<br />
SetEnv PHPRC &#171;C:/PHP/&#187;</p>
<p>После этого тестовый php файл наконец то вывел phpinfo() и теперь можно со спокойно совестью ставить mysql
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">как установить модуль на opencart</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">как отправить файлы на ип c#</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">csharp передача файлов по сети</a></li>
<li><a href="http://rosomakho.ru/proj_prof/csharp-zapisyvaem-video-i-zvuk-s-web-kamery/">c#. берем web-камеру под контроль</a></li>
<li><a href="http://rosomakho.ru/category/proj_prof/">c#. берем web-камеру под контроль</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">создание модуля opencart</a></li>
</ul>
<div class="shr-publisher-1013"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/proj_prof/ustanovka-php-pod-apache-v-windows-server-2008/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Поиски работы</title>
		<link>http://rosomakho.ru/blog/poiski-raboty/</link>
		<comments>http://rosomakho.ru/blog/poiski-raboty/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 16:41:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[работа]]></category>
		<category><![CDATA[собеседования]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=998</guid>
		<description><![CDATA[Сейчас озаботился поиском работы, ходил пока на собеседование в 1с рарус и в компанию &#171;Эргосоло&#187;, которая сделала &#171;Соло на клавиатуре&#187;. Скоро узнаю результаты. Чтобы работать в &#171;Эргосоло&#187; нужно уметь быстро печатать так что сейчас усиленно прохожу их курс слепой печати десятью пальцами. Посмотрим что из этого выйдет. Это очень полезный навык для любого блоггера, помогает [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас озаботился поиском работы, ходил пока на собеседование в 1с рарус и в компанию &#171;Эргосоло&#187;, которая сделала &#171;Соло на клавиатуре&#187;. Скоро узнаю результаты. Чтобы работать в &#171;Эргосоло&#187; нужно уметь быстро печатать так что сейчас усиленно прохожу их курс слепой печати десятью пальцами. Посмотрим что из этого выйдет. Это очень полезный навык для любого блоггера, помогает писать подробные и интересные сообщения, а не так как сейчас, &#171;отписки&#187;.</p>
<p>Вообще конечно радует, что на рынке много вакансий программиста .net. Еще подучить c# и можно будет устраиваться туда. Нужно только сделать пару интересных проектов с использованием возможностей .net и добавить их в свое портфолио.</p>
<p>На собеседовании, мне кажется, мне слегка помог опыт бауманских дебатов. Нужно не бояться собеседника, не мямлить и быть уверенным в себе. Правда я думаю у меня не очень получалось, так как на дебаты я ходил не так много раз.</p>
<p>Сейчас в свободное время изучаю c#, позже напишу про этот опыт и дам полезные рекомендации.
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">как создать интернет магазин в opencart</a></li>
<li><a href="http://rosomakho.ru/">программирование web камеры</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart инструкция</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">csharp передача файлов по сети</a></li>
<li><a href="http://rosomakho.ru/proj_prof/csharp-zapisyvaem-video-i-zvuk-s-web-kamery/">работа с веб камерой c#</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">видеокурс инструкция admin area</a></li>
</ul>
<div class="shr-publisher-998"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/blog/poiski-raboty/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Icq и передача файлов на C#</title>
		<link>http://rosomakho.ru/proj_prof/icq-na-c-sharp/</link>
		<comments>http://rosomakho.ru/proj_prof/icq-na-c-sharp/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 14:47:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[Проекты Вани]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=973</guid>
		<description><![CDATA[Для всех кто интересуется темой как передавать по инету файлы и текст с помощью C# выкладываю свою программку. В чем ее суть на данный момент: есть окно сообщений, окно лога и кнопки для передачи файла, текста и коннекта. Запускаете прогу два раза из папки дебаг, одна будет &#171;сервер&#187; а другая &#171;клиент&#187;. Для тестирования на локальном [...]]]></description>
			<content:encoded><![CDATA[<p>Для всех кто интересуется темой как передавать по инету файлы и текст с помощью C# выкладываю свою программку.</p>
<p>В чем ее суть на данный момент: есть окно сообщений, окно лога и кнопки для передачи файла, текста и коннекта. Запускаете прогу два раза из папки дебаг, одна будет &#171;сервер&#187; а другая &#171;клиент&#187;. Для тестирования на локальном компе в поле host клиента вводите 127.0.0.1 и жмете connect после чего клиент соединяется с сервером. Можете передавать серверу текст, набитый в текстовом поле а также файлы с помощью send file.</p>
<p>Если ее слегка улучшить в плане получения ip с сервера (ну хотя бы из файлика на вашем сайте) и дизайна то получится icq))</p>
<p>Вот <a href="http://rosomakho.ru/sharp_icq.rar">ссылка на скачку</a> и вдобавок <a href="http://rosomakho.ru/FileTransfer_original.rar">здесь</a> еще одна программка для передачи файлов которую я нарыл в инете.<br />
.net воистину великая вещь, очень удобно программировать!
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/proj_prof/ustanovka-php-pod-apache-v-windows-server-2008/">скачать apache windows server 2008</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">видеокурсы по opencart</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">передать файл через tsp c#</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">уроки по opencart</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">csharp передача файлов по сети</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">c# класс networkstream</a></li>
</ul>
<div class="shr-publisher-973"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/proj_prof/icq-na-c-sharp/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Mvc Cms 2.0</title>
		<link>http://rosomakho.ru/blog/mvc-cms-2-0/</link>
		<comments>http://rosomakho.ru/blog/mvc-cms-2-0/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 07:32:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=969</guid>
		<description><![CDATA[Сейчас читаю книгу web 2.0 программирование на php. Там предлагается создать cms на основе модели mvc (model-view-controller) для мультиблоггинга. Постараюсь ее расширить для обмена файлами или ботвой. Кстати opencart тоже написан по модели mvc, возможно потом смогу лучше понять как он работает. Мой блог находят по следующим фразам как передать файл по tcp c# передача [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас читаю книгу web 2.0 программирование на php. Там предлагается создать cms на основе модели mvc (model-view-controller) для мультиблоггинга. Постараюсь ее расширить для обмена файлами или ботвой. Кстати opencart тоже написан по модели mvc, возможно потом смогу лучше понять как он работает.
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">как передать файл по tcp c#</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">передача файла по tcp c#</a></li>
<li><a href="http://rosomakho.ru/proj_prof/opencart-instrukciya-plan/">модуль import export opencart инструкция</a></li>
<li><a href="http://rosomakho.ru/blog/mvc-cms-2-0/">php cms mvc</a></li>
<li><a href="http://rosomakho.ru/">www.rosomakho.ru</a></li>
<li><a href="http://rosomakho.ru/proj_prof/opencart-instrukciya-plan/">структура базы данных opencart</a></li>
</ul>
<div class="shr-publisher-969"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/blog/mvc-cms-2-0/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Opencart Fail</title>
		<link>http://rosomakho.ru/blog/opencart-fail/</link>
		<comments>http://rosomakho.ru/blog/opencart-fail/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 07:30:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Блог]]></category>
		<category><![CDATA[opencart]]></category>

		<guid isPermaLink="false">http://rosomakho.ru/?p=967</guid>
		<description><![CDATA[К сожалению ноутбук с инструкцией украли. Так что вся работа пропала. Последнюю незаконченную версию скачайте с моего сайта. Скачать&#8230; Пока что занимаюсь не opencart а другими делами. Однако если у Вас есть вопросы по opencart пишите в комментариях,постараюсь ответить! Мой блог находят по следующим фразам что поделать летом opencart инструкция как установить модули opencart c# [...]]]></description>
			<content:encoded><![CDATA[<p>К сожалению ноутбук с инструкцией украли. Так что вся работа пропала.<br />
Последнюю незаконченную версию скачайте с моего сайта. <a href="http://rosomakho.ru/rus147.zip">Скачать&#8230;</a><br />
Пока что занимаюсь не opencart а другими делами. Однако если у Вас есть вопросы по opencart пишите в комментариях,постараюсь ответить!
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://rosomakho.ru/blog/chto-delat-letom/">что поделать летом</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">opencart инструкция</a></li>
<li><a href="http://rosomakho.ru/blog/opencart-instrukciya-videouroki/">как установить модули opencart</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">c# http передать файл</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">c# networkstream передача файла</a></li>
<li><a href="http://rosomakho.ru/blog/c-sharp-peredacha-fajla/">передача файлов сокет c#</a></li>
</ul>
<div class="shr-publisher-967"></div>]]></content:encoded>
			<wfw:commentRss>http://rosomakho.ru/blog/opencart-fail/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
