Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
#1

Отображение процесса конвертирования видео FFMPEG с Progress Bar в С# - C#

23.04.2013, 20:48. Просмотров 3660. Ответов 16
Метки нет (Все метки)

У меня проект Windows Form. Необходимо чтобы на форме отображался процесс конвертирования, возможно с компонентами: label или Progress Bar.

У меня такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 Process p = new Process();
                
                ProcessStartInfo info = new ProcessStartInfo();
                info.FileName = Application.StartupPath + "\\ffmpeg_files\\ffmpeg.exe";
                info.WindowStyle = ProcessWindowStyle.Hidden; // Предоставляет возможность скрыть консольное окно ffmpeg, при выполнении конвертации.
                p.StartInfo.CreateNoWindow = false;
               info.Arguments = " -i " + randomString + ext + " -ar 22050 -ab 128k -f flv -b 700k -s 640x480 -y " + randomString + ".flv";
                p = Process.Start(info);
                p.WaitForExit();
                p.Close();
                txtFilename.Text = randomString + ".flv";
 
 
                info.Arguments = " -i " + randomString + ".flv" + " -vframes 1 -s 640x480 " + randomString + ".jpg";
                p = Process.Start(info);
                p.WaitForExit();
                p.Close()
Облазил весь google и не где нет информации.
А что Вы думаете по этому поводу?

Добавлено через 13 минут
Нет, серьёзно ребята! Информацию, которую я за целую неделю нашел, это для ASP.NET.
Если у Вас много работы и мало времени, то подскажите хоть "откуда копать".
Пусть процесс конвертации отображается не в прогресс баре, а в чем-то другом. Хоть что-то.
http://www.cyberforum.ru/csharp-net/thread824288.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2013, 20:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Отображение процесса конвертирования видео FFMPEG с Progress Bar в С# (C#):

buttons and progress bar
Как сделать так, чтобы при нажатии кнопки шла загрузка progress bar. И...

Progress bar и многое другое
Люди, смотрите, есть progress bar допустим ну и типа того. Допустим я хочу свой...

Ffmpeg wrapper. Не обрезаются длинные видео
Здравствуйте! Мне нужно программно обрезать видеофайл. Как напрямую работать с ...

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

Отображение процесса выполнения
Может еще кто нибудь подскажет как привязать progresbar к процесу? Достаточно...

16
BeBrave
7 / 29 / 7
Регистрация: 04.04.2013
Сообщений: 282
24.04.2013, 13:44 #2
К чему вы хотите привязать?

Можно привязать к тысячи элементов в этом процессе....

Вобще странно что вы сделали конвертр, но не можете сделать прогресс бар О_о
0
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
24.04.2013, 15:27  [ТС] #3
Цитата Сообщение от BeBrave Посмотреть сообщение
К чему вы хотите привязать?

Можно привязать к тысячи элементов в этом процессе....

Вобще странно что вы сделали конвертр, но не можете сделать прогресс бар О_о
Конветор это элементарщина.
Конвертор я не писал, так файл ffmpeg.exe скачал с официального сайта, если вы конечно внимательно смотрели код.
К чему я хочу привязать? Я самом начале объяснил, что мне нужно чтобы было видно кол-во оставшегося времени на конвертацию. Мне нужно, чтобы на самой форме было видно процесс кодирования видео из консольной программы ffmpeg при конвертации больших файлов. С# я только изучаю. Написал код программы Video Uploader которая мне нужна, для личного видео сайта. Программа работает на УРА. Кодирует видео, вытаскивает кадр из видео, генерирует случайное название видео файла и картинки, заливает все это по ФТП, соединяется удаленно с базой MySql на сервере, вставляет в таблицу данные. Единственно, что не хватает для любого нормального аплодера прогресс бара, который бы отобрал сколько осталось времени до конца процесса конвертирования видео.
И в интернете нет инфы про это, то только для ASP.Net.
Я уже в самом начале темы об этом написал.
Да, удивительно, что не кто с этим не сталкивался.

Добавлено через 20 минут
Цитата Сообщение от BeBrave Посмотреть сообщение
К чему вы хотите привязать?

Можно привязать к тысячи элементов в этом процессе....

Вобще странно что вы сделали конвертр, но не можете сделать прогресс бар О_о
Нужно хотя бы вывести текст из консоли ffmpeg.exe в окно формы с компонентом label.
0
alechka
74 / 49 / 14
Регистрация: 28.03.2013
Сообщений: 175
24.04.2013, 17:02 #4
лови простенький пример как забирать output из другого процесса

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        static void Main(string[] args)
        {
            var info = new ProcessStartInfo()
                {
                    FileName = "ping",
                    Arguments = "ya.ru",
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                };
 
            
            var process = Process.Start(info);
            process.OutputDataReceived += Handler;
            process.BeginOutputReadLine();
            process.WaitForExit();
        }
 
        static void Handler(object process, DataReceivedEventArgs line)
        {
            Console.WriteLine(line.Data);
        }
1
KeBJIaP
145 / 142 / 32
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
24.04.2013, 17:05 #5
Я так понимаю, нужно чтобы ffmpeg.exe сообщил сколько времени ему работать осталось
0
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
24.04.2013, 19:02  [ТС] #6
Цитата Сообщение от KeBJIaP Посмотреть сообщение
Я так понимаю, нужно чтобы ffmpeg.exe сообщил сколько времени ему работать осталось
Именно так.

Добавлено через 50 минут
Цитата Сообщение от alechka Посмотреть сообщение
лови простенький пример как забирать output из другого процесса
Спасибо. А нельзя вывести строку из консоли на форме, с компонентом label1

Добавлено через 19 минут
Цитата Сообщение от alechka Посмотреть сообщение
лови простенький пример как забирать output из другого процесса
Возвращает пустую строку.
0
alechka
74 / 49 / 14
Регистрация: 28.03.2013
Сообщений: 175
24.04.2013, 19:05 #7
Цитата Сообщение от helppo Посмотреть сообщение
Добавлено через 19 минут
Возвращает пустую строку.
при пинге да - первое попадание с пустой строкой, дальше строки меняются.
0
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
24.04.2013, 22:58  [ТС] #8
Цитата Сообщение от alechka Посмотреть сообщение
при пинге да - первое попадание с пустой строкой, дальше строки меняются.
А как сделать чтобы он мне выдавал в строке процесс кодирования файла, чтобы в label1.text это отображалось?

Добавлено через 27 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char[] letters = "rakvexplvceaqzmvwxklgfcys1234567890WALHCVRSEP".ToCharArray();
                Random r = new Random();
                string randomString = "";
                for (int i = 0; i < 25; i++)
                {
                    randomString += letters[r.Next(0, 45)].ToString();
                }
 
string ext = Path.GetExtension(openFileDialog1.FileName);
System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo.FileName = Application.StartupPath + "\\ffmpeg_files\\ffmpeg.exe";
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.RedirectStandardInput = true;
                proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                proc.StartInfo.CreateNoWindow = true;
                proc.StartInfo.Arguments = " -i " + randomString + ext + " -ar 22050 -ab 128k -f flv -b 900k -s 640x480 -y " + randomString + ".flv";
                proc.Start();
                proc.WaitForExit();
                proc.Close();
0
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
24.04.2013, 23:13  [ТС] #9
label1.text хочу увидеть это:
0
Миниатюры
Отображение процесса конвертирования видео FFMPEG с Progress Bar в С#  
kolorotur
Эксперт .NET
9920 / 8305 / 2038
Регистрация: 17.09.2011
Сообщений: 14,291
24.04.2013, 23:16 #10
helppo, ffmpeg прогресс пишет в stderr, его и считывайте:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Process p = new Process();
 
var info = p.StartInfo;
info.FileName = info.FileName = Application.StartupPath + "\\ffmpeg_files\\ffmpeg.exe";
info.Arguments = " -i " + randomString + ext + " -ar 22050 -ab 128k -f flv -b 700k -s 640x480 -y " + randomString + ".flv";
info.CreateNoWindow = true;
info.UseShellExecute = false;
info.RedirectStandardError = true;
p = Process.Start(info);
 
string line;
while ((line = p.StandardError.ReadLine()) != null)
   label1.Text = line;
Обработку входа можете затолкать в BackgroundWorker и менять лейблу вызовом ReportProgress(0, line);
1
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
25.04.2013, 00:14  [ТС] #11
Цитата Сообщение от kolorotur Посмотреть сообщение
helppo
Обработку входа можете затолкать в BackgroundWorker и менять лейблу вызовом ReportProgress(0, line);
А сможете в коде показать? Это все что надо.

Добавлено через 35 минут
А можно обновлять строку, без BackgroundWorker?
0
kolorotur
Эксперт .NET
9920 / 8305 / 2038
Регистрация: 17.09.2011
Сообщений: 14,291
25.04.2013, 01:17 #12
Ну как-то так получится.
Бросьте на форму кнопку, лейбу и background worker.
Кнопке на клик поставьте первый обработчик, воркеру остальные в порядке объявления.
Так же воркеру установите свойства ReportsProgress и SupportsCancellation на True

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
private void button1_Click(object sender, EventArgs e)
{
   var button = sender as Button;
 
   if (worker.IsBusy) worker.CancelAsync();
   else 
   {
      button.Text = "Stop";
      worker.RunWorkerAsync();
   }
}
 
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
   var worker = sender as BackgroundWorker;
 
   Process p = new Process();
 
   var info = p.StartInfo;
   info.FileName = info.FileName = Application.StartupPath + "\\ffmpeg_files\\ffmpeg.exe";
   info.Arguments = " -i " + randomString + ext + " -ar 22050 -ab 128k -f flv -b 700k -s 640x480 -y " + randomString + ".flv";
   info.CreateNoWindow = true;
   info.UseShellExecute = false;
   info.RedirectStandardError = true;
   info.RedirectStandardInput = true;
 
   try
   {
      p = Process.Start(info);
 
      string line;
      while ((line = p.StandardError.ReadLine()) != null)
      {
         if (worker.CancellationPending) 
         {
            p.StandardInput.Write('q');
            e.Cancel = true;
         }
         if (line.StartsWith("frame")) worker.ReportProgress(0, line);
      }
      p.WaitForExit();
   }
   finally 
   {
      if (!p.HasExited) p.Kill();
      p.Dispose();
   }
}
 
private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   label.Text = e.UserState.ToString();
}
 
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   if (e.Error != null)
      MessageBox.Show(e.Error.Message, "Conversion failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
   else if (e.Cancelled)
      MessageBox.Show("Conversion has been cancelled.", "Conversion cancelled", MessageBoxButtons.OK, MessageBoxIcon.Information);
   else
      MessageBox.Show("Finished.", "Conversion complete", MessageBoxButtons.OK, MessageBoxIcon.Information);
   convertButton.Text = "Start";
}
Входящую строку можете парсить, если есть желание, и разбивать на логические куски (битрейт, количество обработанных байт и времени мувика и пр.).
Если при этом из ранних логов выцепите лог с метаданными, где ffmpeg выводит общую длительность мувика, то можете считать прогресс обработки в процентах.

В идеале, конечно, можно было бы вместо стороннего процесса просто использовать либы ffmpeg через интероп — там все это получить можно напрямую, без парсинга логов и без использования стороннего процесса.

Добавлено через 25 секунд
Цитата Сообщение от helppo Посмотреть сообщение
А можно обновлять строку, без BackgroundWorker?
Можно, но не нужно — интерфейс висеть будет.
1
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
25.04.2013, 13:25  [ТС] #13
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну как-то так получится.
Бросьте на форму кнопку, лейбу и background worker.
Кнопке на клик поставьте первый обработчик, воркеру остальные в порядке объявления.
Так же воркеру установите свойства ReportsProgress и SupportsCancellation на True

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
private void button1_Click(object sender, EventArgs e)
{
   var button = sender as Button;
 
   if (worker.IsBusy) worker.CancelAsync();
   else 
   {
      button.Text = "Stop";
      worker.RunWorkerAsync();
   }
}
 
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
   var worker = sender as BackgroundWorker;
 
   Process p = new Process();
 
   var info = p.StartInfo;
   info.FileName = info.FileName = Application.StartupPath + "\\ffmpeg_files\\ffmpeg.exe";
   info.Arguments = " -i " + randomString + ext + " -ar 22050 -ab 128k -f flv -b 700k -s 640x480 -y " + randomString + ".flv";
   info.CreateNoWindow = true;
   info.UseShellExecute = false;
   info.RedirectStandardError = true;
   info.RedirectStandardInput = true;
 
   try
   {
      p = Process.Start(info);
 
      string line;
      while ((line = p.StandardError.ReadLine()) != null)
      {
         if (worker.CancellationPending) 
         {
            p.StandardInput.Write('q');
            e.Cancel = true;
         }
         if (line.StartsWith("frame")) worker.ReportProgress(0, line);
      }
      p.WaitForExit();
   }
   finally 
   {
      if (!p.HasExited) p.Kill();
      p.Dispose();
   }
}
 
private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   label.Text = e.UserState.ToString();
}
 
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   if (e.Error != null)
      MessageBox.Show(e.Error.Message, "Conversion failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
   else if (e.Cancelled)
      MessageBox.Show("Conversion has been cancelled.", "Conversion cancelled", MessageBoxButtons.OK, MessageBoxIcon.Information);
   else
      MessageBox.Show("Finished.", "Conversion complete", MessageBoxButtons.OK, MessageBoxIcon.Information);
   convertButton.Text = "Start";
}
Входящую строку можете парсить, если есть желание, и разбивать на логические куски (битрейт, количество обработанных байт и времени мувика и пр.).
Если при этом из ранних логов выцепите лог с метаданными, где ffmpeg выводит общую длительность мувика, то можете считать прогресс обработки в процентах.

В идеале, конечно, можно было бы вместо стороннего процесса просто использовать либы ffmpeg через интероп — там все это получить можно напрямую, без парсинга логов и без использования стороннего процесса.

Добавлено через 25 секунд

Можно, но не нужно — интерфейс висеть будет.
Что нечего не работает. Файл не конвертирует, но зато выводит сообщение: конвертация завершена. И в лейбле нечего нет.
0
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
25.04.2013, 13:48  [ТС] #14
Цитата Сообщение от helppo Посмотреть сообщение
Что нечего не работает. Файл не конвертирует, но зато выводит сообщение: конвертация завершена. И в лейбле нечего нет.
Если вы специалист в этом вопросе, может я вам скину во вложения весь исходник проекта? Поставьте пожалуйста туда сами код, просто я с этим вопрос, еще не сталкивался. Мне надо только эту "работу" сдать.
Сам проект как я и говорил работает как аплоадер, соединяется с базой MySql движка PHPMelody 1.9, конвертирует видео, создает картинку с видео и заливает файлы по FTP на сервер.
0
Вложения
Тип файла: zip PHPMelodyUploaderRelease002a.zip (1.53 Мб, 17 просмотров)
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
26.04.2013, 13:56  [ТС] #15
Программисты! Ау!
0
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
28.04.2013, 17:37  [ТС] #16
В общем нашел решение для своего проекта, с прогресс баром и Process.Start .
Не сказал бы что оно мне полностью подходит. Но с другой стороны возникает возможность визуального контроля за запуском процесса.
На форуме пишет не одна сотня программистов, а также тех кто постигает азы программирования.
И то что не кто не смог реально предложить действующее решение, наводит на определённые мысли.
Уважаемый пользователь kolorotur, благодарю за ваши сообщения, но Ваш код полностью не работает. Так как процесс не запускается и на форме в label1 нечего не показывается, но все равно я Вас благодарю за потраченное время.
Вот нашел код, который мне нужен хотя бы когда происходит процесс, чтобы пользователь знал, что программа не зависла. То, что мне надо я в пустом интернете не нашел. Дурдом как говорится.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        progressBar1.Style = ProgressBarStyle.Marquee;
        progressBar1.Visible = false;
    }
 
    private void ButtonRunProcess_Click(object sender, EventArgs e) {
        var ProcessObj = new Process();
        ProcessObj.SynchronizingObject = this;
        ProcessObj.EnableRaisingEvents = true;
        ProcessObj.Exited += new EventHandler(ProcessObj_Exited);
        ProcessObj.StartInfo.FileName = @"c:\windows\notepad.exe";
        // etc...
        ProcessObj.Start();
        progressBar1.Visible = true;
    }
 
    void ProcessObj_Exited(object sender, EventArgs e) {
        progressBar1.Visible = false;
    }
}
0
helppo
1 / 1 / 1
Регистрация: 16.05.2012
Сообщений: 40
28.04.2013, 17:42  [ТС] #17
И исходник найденного решения.
0
Изображения
 
Вложения
Тип файла: zip apina.zip (45.5 Кб, 74 просмотров)
28.04.2013, 17:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 17:42
Привет! Вот еще темы с решениями:

Отображение процесса скачивания файла
Всем привет) Вообщем у меня возникла проблемка, так вот, как по завершению...

Progress Bar для отображения процесса загрузки view
Всем доброго времени суток! Буду очень благодарна за помощь в решении следующей...

[WPF] Progress Bar и отображение окна
Доброго времени суток, господа! Требуется решение для следующего вопроса: Есть...

Можно ли переделать Progress bar в Track bar?
Можно ли переделать Progress bar в Track bar? От прогресбара нужно всего лишь,...


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

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

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