Поток растрового изображения в видео в C # Howto? - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть код, который получает видеопоток через библиотеку webrtc, который в своей функции показывает их в PictureBox, мой вопрос: как передать этот поток из PictureBox в видео на моем компьютере?

public unsafe void OnRenderRemote(byte* yuv, uint w, uint h)
{
    lock (pictureBoxRemote)
    {
        if (0 == encoderRemote.EncodeI420toBGR24(yuv, w, h, ref bgrBuffremote, true))
        {
            if (remoteImg == null)  
            {    
                var bufHandle = GCHandle.Alloc(bgrBuffremote, GCHandleType.Pinned);
                remoteImg = new Bitmap((int)w, (int)h, (int)w * 3, PixelFormat.Format24bppRgb, bufHandle.AddrOfPinnedObject()); 
            }
        }
    }

    try
    {
        Invoke(renderRemote, this);
    }
    catch // don't throw on form exit
    {
    }
}

Этот код получает поток через webrtc и преобразует его в изображения, которые затем отображаются в PictureBox, вызывающем эту функцию. Мой вопрос:

Как я могу сохранитьмассив или буфер из remoteImg изображений, чтобы я мог записать его в видеофайл на моем компьютере?

Попробуйте сделать что-то вроде этого:

FileWriter.Open ("C:\\Users\\assa\\record.avi", (int) w, (int) h, (int) w * 3, VideoCodec.Default, 5000000);
FileWriter.WriteVideoFrame (remoteImg);

, но сохраните только один снимок икроме видео, есть ли способ сохранить изображения потока с помощью функции OnRenderRemote (описанной выше), чтобы иметь возможность сохранять их в видео?

OnRenderRemote обновляет только PictureBoxкаждый раз, когда он вызывается, но я не знаю, как сохранить этот поток в видео.

Спасибо.

1 Ответ

0 голосов
/ 30 декабря 2018

Во-первых: я не знаю, как именно работает webrtc, но я могу объяснить вам, как вы должны обрабатывать изображения, чтобы сохранить их в файл.

Хорошо, давайте начнем: в настоящее время у вас есть только полноразмерные растровые изображенияваши собственные, которые приходят из библиотеки.Это прекрасно, если вы не заботитесь о размере файла и хотите показать только «последний» кадр.Чтобы сохранить несколько кадров в файле, который мы назвали бы «видео», вам необходим кодировщик, который обрабатывает эти кадры вместе.

Сложные вещи просты: кодировщик берет 2 кадра, называет их кадрами A и B и затем сжимает их таким образом, что сохраняются только изменения из кадра A в кадр B.Это экономит много памяти, потому что в видео мы хотим видеть только "изменения", то есть движения от одного кадра к другому.Существует довольно много кодировщиков, но в основном вы можете увидеть ffmpeg, он очень популярен, и для него достаточно много обёрток c #, так что посмотрите.

Обобщение: чтобы сделать 2-x изображений «видео», вы должны обработать их с помощью кодера, который обрабатывает изображения в формате, который может воспроизводиться видеопроигрывателем.

...