Как сделать несколько записей экрана с одной и той же частью экрана

Я могу только выбрать часть экрана для записи вручную. Я хочу, чтобы все они были одинаковыми, чтобы при последовательном воспроизведении видео все выстраивалось в линию.

введите описание изображения здесь

Я использую quicktime и в идеале хотел бы просто придерживаться этого, если это возможно.

Вы можете найти это полезным: apple.stackexchange.com/questions/63056/…
Спасибо, это направило меня в правильном направлении... Сейчас я опубликую свое решение...

Ответы (4)

Здесь в 2020 году — macOS Catalina и более поздние версии позволяют встроенному /usr/sbin/screencaptureинструменту иметь параметры для указания области захвата. И если вы используете его графически, он запоминает последний выбор, поэтому, если вы его не измените, вы можете перезапустить приложение и получить те же настройки без подробностей ниже.

  -R<x,y,w,h> capture screen rect
  -v        capture video recording of the screen

Например:

screencapture -R10,10,500,500 -v cap.mov

На справочной странице есть куча других полезных вещей:

man screencapture
Ура, мой код теперь лишний. Идеально, спасибо :)

ОБНОВЛЕНИЕ: ответ @Andre LaBranche лучше, прочитайте это


Сохраните этот скрипт как caperture.swift:

#!/usr/bin/env xcrun swift
import Foundation

// Start QuickTime Player using AppleScript
func startQT() {
    var scriptToPerform: NSAppleScript?
    let asCommand = "tell application \"QuickTime Player\" \n" +
            " activate \n" +
            " new screen recording \n" +
            " delay 1 \n" +
            " tell application \"System Events\" to key code 49 \n" +
            " delay 1\n" +
            " end tell"

    scriptToPerform = NSAppleScript(source:asCommand)
    var possibleError: NSDictionary?

    if let script = scriptToPerform {
        script.executeAndReturnError(&possibleError)
        if let error = possibleError {
            print("ERROR: \(error)")
        }
    }
}

// Click and drag the mouse as defined by the supplied commandline arguments
func dragMouse() {
    let args = UserDefaults.standard

    let x = CGFloat(args.integer(forKey: "x"))
    let y = CGFloat(args.integer(forKey: "y"))
    let w = CGFloat(args.integer(forKey: "w"))
    let h = CGFloat(args.integer(forKey: "h"))

    let p0 = NSPointToCGPoint(NSMakePoint(x, y))
    let p1 = NSPointToCGPoint(NSMakePoint(x + w, y + h))

    let mouseDown = CGEvent(mouseEventSource: nil, mouseType: CGEventType.leftMouseDown, mouseCursorPosition: p0, mouseButton: CGMouseButton.left)!
    let mouseDrag = CGEvent(mouseEventSource: nil, mouseType: CGEventType.leftMouseDragged, mouseCursorPosition: p1, mouseButton: CGMouseButton.left)!
    let mouseUp = CGEvent(mouseEventSource: nil, mouseType: CGEventType.leftMouseUp, mouseCursorPosition: p1, mouseButton: CGMouseButton.left)!

    let kDelayUSec : useconds_t = 500_000

    mouseDown.post(tap: CGEventTapLocation.cghidEventTap)
    usleep(kDelayUSec)
    mouseDrag.post(tap: CGEventTapLocation.cghidEventTap)
    usleep(kDelayUSec)
    mouseUp.post(tap: CGEventTapLocation.cghidEventTap)
}


if (CommandLine.arguments.count != 9) {
    print("usage:")
    print("    ./caperture.swift -x 100 -y 100 -w 400 -h 300")
} else {
    startQT()
    dragMouse()
}

Как только caperture.swiftфайл будет сохранен. Вам нужно будет убедиться, что он может быть выполнен.

В Terminal.app выполните команду:

chmod +x caperture.swift

Затем вы выполняете его с помощью:

./caperture.swift -x 100 -y 100 -w 400 -h 300

Это запустит проигрыватель QuickTime, готовый начать запись следующим образом:

Скриншот

Он основан на AppleScript и Swift, поэтому вам также потребуется установить xcode.

Это было действительно полезно для меня, поэтому я выложил его на github в качестве капертуры на случай, если кто-то захочет его улучшить.

Я думаю, что это может быть наш первый ответ с быстрым кодом! Звездный!
Я отредактировал ответ. Но я не редактировал ошибку в вашем коде, так как это может быть сделано намеренно по какой-то причине. Но в строке let p1 = CGPointMake(x + dx, y + dy)должно быть let p1 = CGPointMake(dx, dy)нет необходимости добавлять целые числа, и это делает неверными границы того, что помещено в applescript. Пример, если я использую границы, {364, 206, 1038, 726}я получу перетаскиваемое окно.{364, 206, 1402, 932}
Спасибо, Марк. dx и dy фактически представляют ширину и высоту, а не точку внизу справа, поэтому я переименовал, чтобы отразить это. Я также отказался от вашего предложения объединить в один файл. Текущую версию см. на github.com/mattburns/caperture . Ваше здоровье
Хороший мат. Мне нравится этот код, так как его можно использовать для многих вещей. Спасибо. Кстати, вы должны принять свой собственный ответ...

Существует приложение под названием Screeny , которое делает это, а также многое другое. $ 14,99 и может быть приобретено в магазине приложений

Мне очень нравится ответ @mat-burns.

Но так как мы все равно будем запускать Applescript из командной строки для выполнения быстрого кода, я хотел сделать все это из одного файла.

Добавление Applescript в быстрый код:

#!/usr/bin/env xcrun swift
import Foundation

let kDelayUSec : useconds_t = 500_000

func DragMouse(p0: CGPoint, p1: CGPoint) {
    let mouseDown = CGEventCreateMouseEvent(nil, CGEventType(kCGEventLeftMouseDown), p0, CGMouseButton(kCGMouseButtonLeft)).takeUnretainedValue()
    let mouseDrag = CGEventCreateMouseEvent(nil, CGEventType(kCGEventLeftMouseDragged), p1, CGMouseButton(kCGMouseButtonLeft)).takeUnretainedValue()
    let mouseUp = CGEventCreateMouseEvent(nil, CGEventType(kCGEventLeftMouseUp), p1, CGMouseButton(kCGMouseButtonLeft)).takeUnretainedValue()

    CGEventPost(CGEventTapLocation(kCGHIDEventTap), mouseDown)
    usleep(kDelayUSec)
    CGEventPost(CGEventTapLocation(kCGHIDEventTap), mouseDrag)
    usleep(kDelayUSec)
    CGEventPost(CGEventTapLocation(kCGHIDEventTap), mouseUp)
}

func ascript(){


    var scriptToPerform: NSAppleScript?
    let asCommand = "tell application \"QuickTime Player\" \n activate \n new screen recording \n delay 1 \n tell application \"System Events\" to key code 49 \n delay 1\n end tell"

  scriptToPerform = NSAppleScript(source:asCommand)
   var errorInfo = AutoreleasingUnsafeMutablePointer<NSDictionary?>()


    if let script = scriptToPerform {

        script.executeAndReturnError(errorInfo)


    }

}

func main() {
let p0 = CGPointMake( CGFloat(atoi( C_ARGV[1])), CGFloat(atoi( C_ARGV[2])))
let p1 = CGPointMake( CGFloat(atoi( C_ARGV[3])),  CGFloat(atoi( C_ARGV[4])))

DragMouse(p0, p1)
}
ascript()
main()

После того, как код сохранен и мы запустили /bin/chmod +x ~/scripts/clickdrag.swift, чтобы сделать скрипт исполняемым

Измените ~/scripts/clickdrag.swiftфактический путь к файлу swift.

Теперь мы можем запустить код из командной строки:

ОБНОВЛЯТЬ

Раньше вам пришлось бы вводить командную строку так:

~/scripts/clickdrag.swift -x 364 -y 206 -dx 1038 -dy 726

Но если мы воспользуемся простым способом определения любых необходимых границ, открыв окно поиска и придав ему форму области, которую вы хотите захватить.

Затем запустите этот Applescript:

tell application "Finder" to get bounds of window 1

Это вернет границы на панели результатов.

-> {364, 206, 1038, 726}

Было бы намного проще скопировать и вставить 364, 206, 1038, 726в команду как есть.

Приведенное выше обновление позволяет вам запускать команду следующим образом.

~/scripts/clickdrag.swift 364, 206, 1038, 726