#c# #ffmpeg #rtmp #live-streaming #red5
Вопрос:
Я работаю над задачей, в которой мне нужно захватить поток с IP-камеры, а затем отправить кадр захвата на RTMP-сервер.
для захвата кадра изображения с камеры я использую оболочку OpenCV C# Emgu CV.
Для отправки кадра на RTMP-сервер я использую ffmpeg, но он работает нормально. Может ли кто-нибудь помочь мне с тем, как я могу выполнить эту задачу.
private void ProcessFrame(object sender, EventArgs e)
{
try
{
if (_capture != null amp;amp; _capture.Ptr != IntPtr.Zero)
{
_capture.Retrieve(_frame, 0);
if (_capture.IsOpened)
{
string imagename = "image" count ".png";
_frame.Save(@"C:\Staging\Jacob\CameraImage\" imagename);
var myBinary = ImageToByteArray(_frame.ToBitmap());
if (ffMpegTask != null)
{
ffMpegTask.Write(myBinary, 0, myBinary.Length);
if ((DateTime.UtcNow - starttime).TotalSeconds > 5)
{
ffMpegTask.Write(myBinary, 0, myBinary.Length);
starttime = DateTime.UtcNow;
}
}
else
{
ffMpegg = new NReco.VideoConverter.FFMpegConverter();
ffMpegTask = ffMpegg.ConvertLiveMedia(
null,
"rawvideo",
"rtmp://localhost/live/abcd",
Format.flv,
new ConvertSettings()
{
//CustomInputArgs = String.Format(" -pix_fmt bgr24 -video_size 640x360 -framerate 5 "),
//CustomInputArgs = String.Format(" -pix_fmt bgr24 -video_size 640x480 -framerate 5 ",frameBmp.Width, frameBmp.Height)
CustomInputArgs = String.Format("-y -an -f rawvideo -vcodec rawvideo -pix_fmt bgr24 -video_size 640x480 -framerate 5 -r 5", _frame.Width, _frame.Height),
//CustomOutputArgs = "-c:v libx264 -pix_fmt yuv420p -preset ultrafast -f flv",
CustomOutputArgs = "-c:v libx264 -pix_fmt yuv420p -preset ultrafast -f flv",
}
);
ffMpegTask.Start();
}
}
else
{
process.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
В приведенном выше коде я постоянно получаю кадр изображения, теперь мне нужно непрерывно отправлять этот кадр на rtmp — сервер для прямой трансляции.
Ответ №1:
Вы хотите получить изображение с IP-камеры, затем обработать кадр с помощью OpenCV, наконец, закодировать с помощью FFmpeg и отправить на медиасервер с помощью FFmpeg? Ваш рабочий процесс выглядит следующим образом:
IP Camera --YUV---> OpenCV ---Frame--> FFmpeg --RTMP---> Media Server
Существует еще один рабочий процесс, который может быть очень простым, чтобы использовать FFmpeg для прямого извлечения потока с вашей IP-камеры, а затем обработать поток RTMP с помощью OpenCV, например:
IP Camera -RTSP-> FFmpeg -> Media Server -> OpenCV/FFmpeg -> Media Server
Например:
- Используйте FFmpeg для извлечения RTSP с IP — камеры и передачи RTMP на медиасервер.
- Используйте OpenCV/FFmpeg для извлечения RTMP с медиа-сервера и его обработки.
- После обработки потока RTMP отправьте еще один новый поток RTMP на медиасервер.
Все компоненты используют общий протокол RTSP/RTMP в конвейере.