2 / 2 / 2
Регистрация: 30.09.2018
Сообщений: 49

Вывод ffmpeg по видео

03.10.2023, 01:56. Показов 866. Ответов 4

Author24 — интернет-сервис помощи студентам
Мужики, выручайте. Тут сидят люди умные в отличие от меня. В общем,
у меня программа которая выполняет команду -hide_banner -i
и мне нужно чтобы чтобы программа записала вывод по видосу в таком виде
Name: videoplayback.mp4

File_format: mov,mp4,m4a,3gp,3g2,mj2
Creation_time: 2019-01-22T23:54:09.000000Z
Duration: 00:07:20.65,
Bitrate: 418 kb/s

Program:

Stream #0:0[0x1]
Type: Video
Codec: h264
Profile: Main
Level: avc1 / 0x31637661
Pixel_format: yuv420p(progressive)
Resolution: 480x360
Stream_aspect:
Pixel_aspect: 1:1
Display_aspect: 4:3
FPS: 25
Bitrate: 287 kb/s
Duration:

Stream #0:1[0x2]
Type: Audio
Languige: (spa)
Codec: aac
Profile: LC
Level: mp4a / 0x6134706D
Sample_rate: 44100
Channel_format: streo
Bitrate: 128 kb/s
Duration:

Может кто-то уже работал с выводами ffmpeg и знает как нужно разбивать эту строку с инфой о видосе и аудио, может кто подскажет
Вот мой код:
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
private async Task AddFileToUI(string filePath)
        {
            try
            {
                string fileName = Path.GetFileName(filePath);
                logText += $"Start of metadata processing for {fileName}" + Environment.NewLine;
 
                // Создаем команду для выполнения
                string command = $" -hide_banner -i \"{filePath}\"";
                logText += $"Command metadata processing for {command}" + Environment.NewLine;
 
                // Выполняем команду и записываем вывод в файл
                string outputFilePath = Path.ChangeExtension(filePath, "txt");
 
                string output = await ExecuteFFmpegCommandAsync(command);
 
                // Извлекаем нужную информацию из вывода FFmpeg
                var videoInfo = ExtractVideoInfo(output);
                var audioInfos = ExtractAudioInfos(output);
 
                // Создаем информацию о файле
                var fileInfo = CreateFileInfo(videoInfo, audioInfos, filePath);
 
                // Сохраняем информацию о файле в текстовый файл
                SaveFileInfoToFile(outputFilePath, fileInfo, output);
 
                // собираем информуцю для UI
                var finalFileInfo = CreateFileInfo(videoInfo, audioInfos, filePath);
 
                // Вызов метода UpdateUI с информацией о файле
                UpdateUI(filePath, finalFileInfo);                
 
                logText += $"Finish of metadata processing for {fileName}" + Environment.NewLine + Environment.NewLine;
                //CreateSnapshots(queue, fileName, filePath, snapshotsOutputDirectory, videoDurationDictionary, videoFPSDictionary);
            }
            catch (Exception ex)
            {
                // Обработать ошибку и уведомить пользователя
                HandleError(filePath, ex);
            }
        }
        
        private async Task<string> ExecuteFFmpegCommandAsync(string command)
        {
            using (var process = new Process())
            {
                process.StartInfo.FileName = ffmpegPath;
                process.StartInfo.Arguments = command;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.CreateNoWindow = true;
 
                process.Start();
 
                var output = process.StandardError.ReadToEnd(); // Ждем завершения и считываем вывод
 
                process.WaitForExit();
 
                return output;
            }
        }
 
 
        private string RemoveTextInBrackets(string input)
        {
            // Удаляем текст в скобках
            var withoutBrackets = Regex.Replace(input, @"\([^()]*\)", "").Trim();
 
            // Удаляем запятую после скобок, если она есть
            return withoutBrackets.Replace(",", "").Trim();
        }
 
        private Dictionary<string, string> ExtractVideoInfo(string output)
        {
            var videoInfo = new Dictionary<string, string>();
            var durationPattern = @"Duration:\s*(\S+)";
            var bitratePattern = @"bitrate:\s*(\S+)";
            var codecPattern = @"Video:\s*([^,]+)";
 
            var durationMatch = Regex.Match(output, durationPattern);
            if (durationMatch.Success)
            {
                videoInfo["Duration"] = durationMatch.Groups[1].Value;
 
            }
 
            var bitrateMatch = Regex.Match(output, bitratePattern);
            if (bitrateMatch.Success)
            {
                videoInfo["Bitrate"] = bitrateMatch.Groups[1].Value;
            }
 
            var codecMatch = Regex.Match(output, codecPattern);
            if (codecMatch.Success)
            {
                videoInfo["Codec"] = codecMatch.Groups[1].Value;
            }
 
            return videoInfo;
        }
 
        private List<Dictionary<string, string>> ExtractAudioInfos(string output)
        {
            var audioInfos = new List<Dictionary<string, string>>();
            var lines = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
            var currentAudioInfo = new Dictionary<string, string>();
            var audioInfoRegex = new Regex(@"Stream #\d+:\d+(.*?)Audio:\s(.*?)\s(\d+)\sHz,\s(.*?),\s(\d+)\skb/s");
 
            foreach (var line in lines)
            {
                if (line.Contains("Stream #") && line.Contains("Audio:"))
                {
                    if (currentAudioInfo.Count > 0)
                    {
                        audioInfos.Add(currentAudioInfo);
                        currentAudioInfo = new Dictionary<string, string>();
                    }
 
                    var match = audioInfoRegex.Match(line);
                    if (match.Success)
                    {
                        currentAudioInfo["Stream"] = match.Groups[1].Value.Trim();
                        currentAudioInfo["Codec"] = match.Groups[2].Value.Trim();
                        currentAudioInfo["Sample_rate"] = match.Groups[3].Value.Trim();
                        currentAudioInfo["Channel_format"] = match.Groups[4].Value.Trim();
                        currentAudioInfo["Bitrate"] = match.Groups[5].Value.Trim();
                    }
                }
                else if (currentAudioInfo.Count > 0)
                {
                    // Обработка других параметров аудио, если необходимо
                }
            }
 
            // Добавляем последний поток, если он есть
            if (currentAudioInfo.Count > 0)
            {
                audioInfos.Add(currentAudioInfo);
            }
 
            return audioInfos;
        }
        private string CreateFileInfo(Dictionary<string, string> videoInfo, List<Dictionary<string, string>> audioInfos, string filePath)
        {
            var fileInfoBuilder = new StringBuilder();
 
            // Добавляем информацию о длительности и битрейте видео
            if (videoInfo.TryGetValue("Duration", out string duration) && videoInfo.TryGetValue("Bitrate", out string bitrate))
            {                
                fileInfoBuilder.AppendLine($"Duration: {duration} Bitrate: {bitrate} kb/s");               
            }
 
            // Добавляем информацию о видео-кодеке
            if (videoInfo.TryGetValue("Codec", out string videoCodec))
            {
                videoCodec = RemoveTextInBrackets(videoCodec);
                fileInfoBuilder.AppendLine($"Video: {videoCodec}");
            }
 
            // Добавляем информацию о каждом аудио-потоке
            for (int i = 0; i < audioInfos.Count; i++)
            {
                var audioInfo = audioInfos[i];
                if (audioInfo.TryGetValue("Codec", out string audioCodec))
                {
                    audioCodec = RemoveTextInBrackets(audioCodec);
                    fileInfoBuilder.AppendLine($"Audio: {audioCodec}");
                }
            }
 
 
            return fileInfoBuilder.ToString();
        }
 
        private void SaveFileInfoToFile(string filePath, string fileInfo, string output)
        {
            
            string fileName = Path.GetFileName(filePath);
            string outputFilePath = Path.ChangeExtension(filePath, "txt");
            // вот тут нужно сделать запись в текстовый файл с метаданными
            File.WriteAllText(outputFilePath, resultText);
        }
 
 
 
        private void UpdateUI(string filePath, string finalFileInfo)
        {
            // Создайте экземпляр VideoFileData и заполните его данными
            var videoFileData = new VideoFileData
            {
                FileName = Path.GetFileName(filePath),
                FilePath = filePath,
                FileInfo = finalFileInfo
            };
 
            videoFilesData.Add(videoFileData);
            // Обновите интерфейс с информацией о файле
            Dispatcher.Invoke(() =>
            {
                lock (processedFilesLock)
                {
                    if (!processedFiles.Contains(filePath))
                    {
                        VideoList.Items.Add(videoFileData);
                        processedFiles.Add(filePath);
                    }
                }
            });
        }
        private void HandleError(string filePath, Exception ex)
        {
            System.Windows.MessageBox.Show("Error, wrong metadata!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            return;
        }
Вот примерно так выглядит вывод по ffmpeg который я получаю в output:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\test\snap\John Wick_ Chapter 4 (2023 Movie) Official Trailer.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2023-09-01T05:55:55.000000Z
Duration: 00:02:29.75, start: 0.000000, bitrate: 831 kb/s
Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 700 kb/s, 23.98 fps, 23.98 tbr, 24k tbn (default)
Metadata:
creation_time : 2023-09-01T05:55:55.000000Z
handler_name : ISO Media file produced by Google Inc. Created on: 08/31/2023.
vendor_id : [0][0][0][0]
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2023-09-01T05:55:55.000000Z
handler_name : ISO Media file produced by Google Inc. Created on: 08/31/2023.
vendor_id : [0][0][0][0]
At least one output file must be specified

Собственно найти битрейт и длительность как пень дать, а вот всю вот эту инфу выдать в текст, да и учесть то что вывод разный может быть это уже да, тут я присел, выгорел, сгорел, умер воскрес и снова умер. Знаете как когда думаешь что знаешь уже все, а потом понимаешь что знаешь ничего, ну вот щас у меня такое состояние.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2023, 01:56
Ответы с готовыми решениями:

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

Конвертирование видео библиотекой ffmpeg
Я использую ffmpeg для преобразования своего видео, но когда я устанавливаю определенную конфигурацию для конвертирования, звук после...

Сжатие видео. Не запускается ffmpeg
Добрый вечер, форумчане. Столкнулся с проблемой того, что не запускается ffmpeg. Подскажите, с чем может быть связана ошибка. Ниже фрагмент...

4
Эксперт .NET
 Аватар для kolorotur
17810 / 12961 / 3381
Регистрация: 17.09.2011
Сообщений: 21,250
03.10.2023, 11:21
Цитата Сообщение от A taki da Посмотреть сообщение
мне нужно чтобы чтобы программа записала вывод по видосу в таком виде
[...]
Может кто-то уже работал с выводами ffmpeg и знает как нужно разбивать эту строку с инфой о видосе и аудио, может кто подскажет
То есть вам просто инфу нужно вытянуть?
Для этого ffprobe лучше подходит — он входит в состав ffmpeg и позволяет получить информацию в удобочитаемом формате JSON или XML, распарсить которые встроенными в дотнет средствами — плевое дело.

Пример:
Windows Batch file
1
ffprobe -i "V:\PDINQWUULVLBOICZ.mov" -v quiet -print_format json -hide_banner -show_format -show_streams
Вывод:
JSON
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
123
124
125
126
127
{
    "streams": [
        {
            "index": 0,
            "codec_name": "prores",
            "codec_long_name": "Apple ProRes (iCodec Pro)",
            "profile": "HQ",
            "codec_type": "video",
            "codec_tag_string": "apch",
            "codec_tag": "0x68637061",
            "width": 1920,
            "height": 1080,
            "coded_width": 1920,
            "coded_height": 1080,
            "closed_captions": 0,
            "film_grain": 0,
            "has_b_frames": 0,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "16:9",
            "pix_fmt": "yuv422p10le",
            "level": -99,
            "color_space": "bt709",
            "color_transfer": "bt709",
            "color_primaries": "bt709",
            "field_order": "progressive",
            "refs": 1,
            "id": "0x1",
            "r_frame_rate": "25/1",
            "avg_frame_rate": "25/1",
            "time_base": "1/25",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 144,
            "duration": "5.760000",
            "bit_rate": "137086501",
            "bits_per_raw_sample": "10",
            "nb_frames": "144",
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0,
                "timed_thumbnails": 0,
                "captions": 0,
                "descriptions": 0,
                "metadata": 0,
                "dependent": 0,
                "still_image": 0
            },
            "tags": {
                "creation_time": "2023-03-09T14:18:56.000000Z",
                "language": "eng",
                "handler_name": "Apple Video Media Handler",
                "vendor_id": "appl",
                "encoder": "Apple ProRes 422 HQ",
                "timecode": "00:00:00:00"
            }
        },
        {
            "index": 1,
            "codec_type": "data",
            "codec_tag_string": "tmcd",
            "codec_tag": "0x64636d74",
            "id": "0x2",
            "r_frame_rate": "0/0",
            "avg_frame_rate": "25/1",
            "time_base": "1/25",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 144,
            "duration": "5.760000",
            "bit_rate": "5",
            "nb_frames": "1",
            "extradata_size": 18,
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0,
                "timed_thumbnails": 0,
                "captions": 0,
                "descriptions": 0,
                "metadata": 0,
                "dependent": 0,
                "still_image": 0
            },
            "tags": {
                "creation_time": "2023-03-09T14:18:56.000000Z",
                "language": "eng",
                "handler_name": "Time Code Media Handler",
                "timecode": "00:00:00:00"
            }
        }
    ],
    "format": {
        "filename": "V:\\PDINQWUULVLBOICZ.mov",
        "nb_streams": 2,
        "nb_programs": 0,
        "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
        "format_long_name": "QuickTime / MOV",
        "start_time": "0.000000",
        "duration": "5.760000",
        "size": "99750861",
        "bit_rate": "138542862",
        "probe_score": 100,
        "tags": {
            "major_brand": "qt  ",
            "minor_version": "537199360",
            "compatible_brands": "qt  ",
            "creation_time": "2023-03-09T14:18:56.000000Z"
        }
    }
}
1
2 / 2 / 2
Регистрация: 30.09.2018
Сообщений: 49
03.10.2023, 13:10  [ТС]
Офигеть, классная штука, можно как-то на досуге подумать над этим.
Но у меня такая ситуация, что программа должна брать только ffmpeg и вывести инфу в исключительно в текстовый документ, такое ТЗ, против него не попрешь. И вот моя самая главная беда в том что использовать выражения для поисков нужный информации, получилось только с битрейтом и длительностью с кодеком, ибо их по слову можно найти, а вот другие уже выражением не возьмешь, ибо нету к чему зацепиться, да и взять строку с Stream #0:0[0x1](und): Video: и разбить ее через запитую тоже так себе вышло, ибо у разных видеофайлов там есть скобки в которых тоже запятые и прочее.
Но ваша идея прям огонь, может поговорю с боссом, что так выгоднее или придумаю метод который бы уже работал с этим от ffprobe, огромный респект вам
0
Эксперт .NET
 Аватар для Usaga
12877 / 8923 / 1323
Регистрация: 21.01.2016
Сообщений: 33,520
03.10.2023, 15:22
A taki da, так ffprobe идет в комплекте с ffmpeg…
0
2 / 2 / 2
Регистрация: 30.09.2018
Сообщений: 49
15.10.2023, 20:08  [ТС]
все, мужики всем большое спасибо за помощь, я думал что все тупик, а это просто я читал ошибки а не стандартный выход
Надо было вот так читать вывод
C#
1
process.StandardOutput.ReadToEnd();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.10.2023, 20:08
Помогаю со студенческими работами здесь

FFMPEG. Указать в аргументе куда сохранить видео файл
Дорогие программисты скажите, а возможно ли реализовать сохранение конвертируемого файла в FFMPEG в нужную нам директорию? Вот у меня...

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

Библиотека FFMpeg. Вывод видео
Правильно ли я вывожу видео через данную библиотеку (из демки взял)? Просто проблема в том, что видео воспроизводится если запускать через...

FFMPEG - запись видео с IP камеры, не работает прокрутка видео, при воспроизведение FPS 250. Не могу указать PKT
FFMPEG C++ - запись видео с IP камеры, не работает прокрутка видео, при воспроизведение FPS 250. Не могу указать PKT. Помогайте кто...

видео из ffmpeg
Подскажите можно ли сделать с помощью ffmpeg видео из картинок png, если картинки не через равные промежутки времени? Т.е. каждой картинке...


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

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

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru