عندما يتعلق الأمر بتنفيذ أوامر الشل واسترجاع الإخراج بشكل فوري في لغة البرمجة جولانج، يمكن تحقيق ذلك باستخدام مكتبة os/exec
واستخدام قارئ لقراءة إخراج الأمر. في الكود الذي قدمته، يتم استخدام الدالة print
لطباعة الإخراج الناتج من الأمر.
لتحقيق الهدف الذي تريده، يمكنك تعديل الكود بحيث يتم قراءة الإخراج الناتج من الأمر بشكل دوري ويتم استخراج النسبة المكتملة من الإخراج. فيما يلي نسخة معدلة من الكود:
gopackage 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
يتوقع سلسلة نصية تحتوي على معلومات محددة حول التقدم والتي تظهر عدة مرات أثناء تنفيذ الأمر. تم تصميمه ليطابق السطور التي تحتوي على النمط التالي:
cssframe= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/
بعد ذلك، يتم استخدام دالة extractPercentage
لاستخراج النسبة المكتملة من السطر باستخدام تعبير منتظم جديد يُسمى percentageRegex
. هذا التعبير يستخرج النسبة المئوية من السطر باستخدام النمط (\d+)%
. في حالة العثور على تطابق، يتم إرجاع النسبة المكتملة كنص.
هكذا، تم تحقيق هدفك الذي يتمثل في طباعة النسبة المكتملة بشكل مستمر أثناء تنفيذ أمر FFmpeg باستخدام لغة البرمجة جولانج. يمكنك استخدام هذا الكود كنقطة انطلاق لتطوير المزيد من الوظائف أو التكامل في تطبيقك بشكل أوسع.