Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
MAKC13
1 / 1 / 0
Регистрация: 05.12.2013
Сообщений: 248
1

Запись видео с вебкамеры SharpAvi

15.08.2019, 15:11. Просмотров 96. Ответов 3
Метки нет (Все метки)

Добрый день. Есть необходимость записывать видео в формате mp4, но с более современными кодеками. Пытался в начале использовать библиотеки Aforge и Accord, но из этого ничего не вышло. Мне посоветовали попробовать библиотеку SharpAvi, я попытался используя ее собрать проект, получилось записывать видео с вебкамеры, но периодически выходит ошибка при завершении видео: "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена." Хотя видео записывается, но программу приходится перезапускать. Подскажите, пожалуйста, что нужно поменять, чтобы видео записывалось без проблем?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using Accord.Video;
using Accord.Video.DirectShow;
using Accord.Video.FFMPEG;
using SharpAvi;
using SharpAvi.Output;
using SharpAvi.Codecs;
using Accord.Video.VFW;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Media;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using System.Drawing.Imaging;
 
 
namespace test_video
{
    public partial class Form1 : Form
    {
        static object locker = new object();
        VideoCaptureDevice videoSource;
        FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        Bitmap bitmap;
        AviWriter writer;
 
        IAviVideoStream stream;
 
        public Form1()
        {
            InitializeComponent();
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        }
 
        private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
 
            Bitmap oldImage = bitmap;
 
            lock (locker)
            {
                try
                {
                    bitmap = new Bitmap(eventArgs.Frame);
                    byte[] frameData = BitmapToByteArray(bitmap);
                    //this.writer.WriteVideoFrame(eventArgs.Frame);
                    stream.WriteFrame(true, frameData, 0, frameData.Length);
                }
                catch (Exception ex)
                { /*MessageBox.Show(ex.ToString());*/ }
 
                if (oldImage != null)
                    oldImage.Dispose();
            }
        }
 
        public static byte[] BitmapToByteArray(Bitmap bitmap)
        {
            BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
            int numbytes = bmpdata.Stride * bitmap.Height;
            byte[] bytedata = new byte[numbytes];
            IntPtr ptr = bmpdata.Scan0;
            Marshal.Copy(ptr, bytedata, 0, numbytes);
            bitmap.UnlockBits(bmpdata);
            return bytedata;
        }
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            if (videoDevices.Count > 0)
            {
                videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
                videoSource.VideoResolution = videoSource.VideoCapabilities[0];
                videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
                LoadSettings();
            }
            videoSource.Start();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            if (writer != null)
            {
                writer.Close(); 
            }
            videoSource.SignalToStop();
        }
 
        private void LoadSettings()
        {
            try
            {
                writer = new AviWriter("video.avi")
                {
                    FramesPerSecond = 25,
                    EmitIndex1 = true
                };
                
                var encoder = new Mpeg4VideoEncoderVcm(640, 480, 25, 0, 100, KnownFourCCs.Codecs.X264);
                stream = writer.AddEncodingVideoStream(encoder, true, 640, 480);
 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            
            if (writer != null)
            {
                writer.Close();
            }
            videoSource.SignalToStop();
        }
    }
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2019, 15:11
Ответы с готовыми решениями:

SharpAvi создание видео потока
Привет, друзья. Использую библиотеку SharpAvi, чтобы склеить видео из имеющихся изображений....

Aforge.net видео в реальном времени с вебкамеры
Надо, чтоб пользователь видел видео в реальном времени с вебкамеры в каком нибудь окне.Буду не...

Запись видео со звуком
Всем привет! Мне нужно записывать видео со звуком с вебкамеры. Запись видео реализовал с помощью...

Запись видео со звуком
Здравствуйте. Записываю видео с веб-камеры используя библиотеку Aforge.NET, записываю звук для...

Запись потокового видео
Подскажите с чего начать. Есть поток mms://live.rfn.ru/rtr-planeta_64 , посредством чего мне его...

3
V_Monomax
15.08.2019, 15:36
  #2

Не по теме:

По моему эта тема уже была...

0
Someone007
3226 / 2398 / 1070
Регистрация: 09.05.2015
Сообщений: 5,942
Завершенные тесты: 1
15.08.2019, 17:56 3
Что-то у вас со всеми видео библиотеками аналогичные проблемы, это наводит на мысли что проблема возможно не в библиотеках...
0
MAKC13
1 / 1 / 0
Регистрация: 05.12.2013
Сообщений: 248
15.08.2019, 18:26  [ТС] 4
Someone007, возможно что-то и я не правильно делаю, но я прилагаю код, вроде всё делаю как в примерах, но всё равно возникают ошибки, даже сейчас через раз выходит ошибка. Может в моем коде чего-то не хватает.
0
15.08.2019, 18:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2019, 18:26

Запись видео из Bitmap
Здравствуйте. Достался мне проект на C#. Изображение с web-камеры выводится на форму. Используется...

Запись видео без конвертации
Добрый день. Написал программу по записи видео, видео записывается, но в не нужном формате. Мне...

Запись видео со звуком с вебкамеры при обнаружении движения
Нужна программа, которая бы писала видео (обязательно со звуком) в отдельные файлы, когда перед...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru