البرمجة

تحقيق التقدم المستمر: استخراج نسبة التقدم من إخراج أمر FFmpeg في جولانج

عندما يتعلق الأمر بتنفيذ أوامر الشل واسترجاع الإخراج بشكل فوري في لغة البرمجة جولانج، يمكن تحقيق ذلك باستخدام مكتبة os/exec واستخدام قارئ لقراءة إخراج الأمر. في الكود الذي قدمته، يتم استخدام الدالة print لطباعة الإخراج الناتج من الأمر.

لتحقيق الهدف الذي تريده، يمكنك تعديل الكود بحيث يتم قراءة الإخراج الناتج من الأمر بشكل دوري ويتم استخراج النسبة المكتملة من الإخراج. فيما يلي نسخة معدلة من الكود:

go
package main import ( "bufio" "fmt" "io" "os/exec" "strings" "regexp" "strconv" ) func main() { cmdName := "ffmpeg -i t.webm -acodec aac -vcodec libx264 cmd1.mp4" cmdArgs := strings.Fields(cmdName) cmd := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) stdout, _ := cmd.StdoutPipe() cmd.Start() go printProgress(stdout) cmd.Wait() } // to print the processed information when stdout gets a new line func printProgress(stdout io.ReadCloser) { r := bufio.NewReader(stdout) progressRegex := regexp.MustCompile(`frame=\s+\d+\s+fps=\d+\.\d+\s+q=\d+\.\d+\s+size=\s+\d+kB\stime=\S+\s+bitrate=\s+\d+\.\d+kbits/`) for { line, _, err := r.ReadLine() if err != nil || io.EOF == err { break } // Check if the line matches the expected format if progressRegex.Match(line) { // Extract the percentage from the line percentage := extractPercentage(string(line)) fmt.Printf("%s%%\n", percentage) } } } // Extract percentage from the line using a regular expression func extractPercentage(line string) string { percentageRegex := regexp.MustCompile(`(\d+)%`) match := percentageRegex.FindStringSubmatch(line) if len(match) == 2 { return match[1] } return "0" }

تم إضافة دالة printProgress التي تقوم بفحص الإخراج الناتج من الأمر باستمرار واستخراج النسبة المكتملة. يتم استخدام تعبيرات منتظمة للتحقق من تنسيق الإخراج واستخراج النسبة المكتملة. يتم طباعة النسبة المكتملة في حالة العثور على تطابق.

المزيد من المعلومات

بالطبع، دعنا نوسع قليلاً على الحل الذي تم تقديمه. في الشيفرة المعدلة، تمت إضافة تعبير منتظم جديد يسمى progressRegex، وهو يستخدم للتحقق من تنسيق الإخراج الناتج عن أمر FFmpeg. يتم استخدام هذا التعبير لاستخراج البيانات الرئيسية من السطر الذي يحتوي على معلومات التقدم.

التعبير المنتظم progressRegex يتوقع سلسلة نصية تحتوي على معلومات محددة حول التقدم والتي تظهر عدة مرات أثناء تنفيذ الأمر. تم تصميمه ليطابق السطور التي تحتوي على النمط التالي:

css
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/

بعد ذلك، يتم استخدام دالة extractPercentage لاستخراج النسبة المكتملة من السطر باستخدام تعبير منتظم جديد يُسمى percentageRegex. هذا التعبير يستخرج النسبة المئوية من السطر باستخدام النمط (\d+)%. في حالة العثور على تطابق، يتم إرجاع النسبة المكتملة كنص.

هكذا، تم تحقيق هدفك الذي يتمثل في طباعة النسبة المكتملة بشكل مستمر أثناء تنفيذ أمر FFmpeg باستخدام لغة البرمجة جولانج. يمكنك استخدام هذا الكود كنقطة انطلاق لتطوير المزيد من الوظائف أو التكامل في تطبيقك بشكل أوسع.

زر الذهاب إلى الأعلى