亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Golang中的不同功能中殺死命令Exec

如何在Golang中的不同功能中殺死命令Exec

Go
繁星點點滴滴 2023-01-03 17:05:22
我正在使用命令 exec 運行 FFMPEG 來制作基于 Web 的屏幕錄制。這里我創建了一個 startRecording 函數,但我仍然對在 stopRecording 函數中停止命令進程感到困惑,因為該命令是在 startRecording 函數中執行的。如何在stopRecording函數中停止srartRecording函數中已經運行的進程?這是我的代碼//Handler to create room/start recordfunc RoomCreate(c *fiber.Ctx) error {    fileName := "out.mp4"    fmt.Println(fileName)    if len(os.Args) > 1 {        fileName = os.Args[1]    }        errCh := make(chan error, 2)    ctx, cancelFn := context.WithCancel(context.Background())    // Call to function startRecording    go func() { errCh <- startRecording(ctx, fileName) }()    go func() {        errCh <- nil    }()    err := <-errCh    cancelFn()    if err != nil && err != context.Canceled {        log.Fatalf("Execution failed: %v", err)    }        return c.Redirect(fmt.Sprintf("/room/%s", guuid.New().String()))}//Function to run command FFMPEGfunc startRecording(ctx context.Context, fileName string) error {    ctx, cancelFn := context.WithCancel(ctx)    defer cancelFn()    // Build ffmpeg    ffmpeg := exec.Command("ffmpeg",        "-f", "gdigrab",        "-framerate", "30",        "-i", "desktop",        "-f", "mp4",        fileName,    )    // Stdin for sending data    stdin, err := ffmpeg.StdinPipe()    if err != nil {        return err    }    //var buf bytes.Buffer    defer stdin.Close()    // Run it in the background    errCh := make(chan error, 1)    go func() {        fmt.Printf("Executing: %v\n", strings.Join(ffmpeg.Args, " "))                if err := ffmpeg.Run(); err != nil {            return        }        //fmt.Printf("FFMPEG output:\n%v\n", string(out))        errCh <- err    }()    // Just start sending a bunch of frames    for {                // Check if we're done, otherwise go again        select {        case <-ctx.Done():            return ctx.Err()        case err := <-errCh:            return err        default:        }    }}//Here function to stop Recordingfunc stopRecording(ctx context.Context) error {//Code stop recording in here} 感謝您的提前
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

根據評論的要求。


基本思想是使用全局存儲來存儲您的活動命令。它不一定是全局的,但您需要有更大的范圍,以便您的函數可以訪問它。


var commands = map[string]*exec.Cmd{}


func startRecording(fileName string) error {

    ffmpeg := exec.Command("ffmpeg",

        "-f", "gdigrab",

        "-framerate", "30",

        "-i", "desktop",

        "-f", "mp4",

        fileName,

    )

    commands[fileName] = ffmpeg

    ...

}


func stopRecording(fileName string) error {

    cmd, ok := commands[fileName]

    if !ok {

        return errors.New("command not found")

    }

    defer func() {

        delete(commands, fileName)

    }()

    return cmd.Process.Kill()

}

您可能想使用 sync.Mutexsync.RWMutex來避免并發映射寫入。


所以你的commands云看起來像:


type Commands struct {

    sync.RWMutex

    items map[string]*exec.Cmd

}

// use Commands.Lock() for writing, Commands.RLock() for reading


查看完整回答
反對 回復 2023-01-03
  • 1 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號