GIF स्क्रैचिंग; UNIX तरीका है


57

एक लेने के लिए स्थिर स्क्रीनशॉट अपनी स्क्रीन के एक चयनित भाग की, मैं अक्सर उपयोग scrotके साथ -s shot.png। यह StackExchange पोस्ट में चित्रण जोड़ने के लिए बहुत अच्छा है। मैं भी इस स्क्रिप्ट को Imgur.com पर ऐसे स्क्रीनशॉट को स्वचालित रूप से अपलोड करने के लिए पाया और अपने एक्स क्लिपबोर्ड में एक लिंक डाला!

चलो इसे बारह तक मोड़ देते हैं : मैं इसी तरह जीआईएफ स्क्रैंकास्ट कैसे बना सकता हूं ?

वहाँ रहे हैं जैसे कार्यक्रमों recordmydesktop, byzanzऔर सह के रूप में Ubuntu पूछो पर विचार-विमर्श किया है कि "उपयोगकर्ता के अनुकूल" होने का उद्देश्य, लेकिन मेरे अनुभव में गाड़ी, अक्षम, थोड़ा एक बंद बातें इस तरह के लिए ज्यादातर unscriptable और अनुपयुक्त हैं।

मैं सिर्फ एक क्षेत्र का चयन करना चाहता हूं और एक जीआईएफ रिकॉर्ड करना चाहता हूं, एक कंसोल कमांड के साथ मैं समझ सकता हूं, न कि कुछ आर्कषक अस्थिर जीयूआई अखंडता।

मैं यह कैसे कर सकता हूँ?



2
: कुछ भी टर्मिनल से संबंधित के लिए, यह बेहतर विकल्प हो सकता asciinema.org
Flatron

जवाबों:


68

ठीक है फिर

GIF विमकास्ट!

मैंने शुरू किया ffcast, किया vim, छोड़ दिया ffcast, फिर convertएड .avi.gif

मैंने रिकॉर्डिंग कमांड को दूसरे टर्मिनल में चलाया। $PATHइस उत्तर के अंत में आपके लिए पॉलिश स्क्रिप्ट ।

क्या हुआ?

वश में कर लेना

FFcast उपयोगकर्ता को स्क्रीन रिकॉर्डिंग के लिए इंटरमीडिएटली स्क्रीन क्षेत्र का चयन करने में मदद करता है और ज्यामिति को एक बाहरी कमांड को सौंपता है, जैसे FFmpeg।

ffcastआर्क लिनक्स समुदाय (मुख्य रूप से lolilolicon ) में कुछ हैकिंग का शानदार उत्पाद है । आप इसे जीथब पर (या आर्क ers के लिए AUR ) में पा सकते हैं। इसकी निर्भरता सूची सिर्फ और सिर्फ है , हालांकि आप चाहते हैं ( AUR लिंक ) इंटरैक्टिव आयत चयन के लिए।bashffmpegxrectsel

आप ffmpegकमांड के ठीक बाद झंडे भी जोड़ सकते हैं । मैं -r 1515 फ्रेम प्रति सेकंड और -codec:v huffyuvदोषरहित रिकॉर्डिंग के लिए कब्जा करने के लिए तैयार हूं । (आकार / गुणवत्ता ट्रेडऑफ़ को ट्विक करने के लिए इन के साथ खेलें।)

GIFfing

ImageMagick .aviवीडियो पढ़ सकते हैं और कुछ GIF ऑप्टिमाइज़ेशन ट्रिक्स हैं जो गुणवत्ता को संरक्षित करते हुए फ़ाइल का आकार काफी कम कर देते हैं: सामान्य-उद्देश्य ऑप्टिमाइज़र -layers Optimizeको convertआमंत्रित करने के लिए । ImageMagick मैनुअल में उन्नत अनुकूलन पर भी एक पृष्ठ है।

अंतिम स्क्रिप्ट

यही मेरे अंदर है $PATH। यह कनवर्ट करने से पहले एक अस्थायी फ़ाइल में रिकॉर्ड करता है।

#!/bin/bash
TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
ffcast -s % ffmpeg -y -f x11grab -show_region 1 -framerate 15 \
    -video_size %s -i %D+%c -codec:v huffyuv                  \
    -vf crop="iw-mod(iw\\,2):ih-mod(ih\\,2)" $TMP_AVI         \
&& convert -set delay 10 -layers Optimize $TMP_AVI out.gif

हालिया अपडेट के बाद सही झंडे लगाने के लिए जासूसी के काम के लिए BenC को धन्यवाद ffcast

यदि आप डेबियन-आधारित डिस्ट्रो पर निर्भरता स्थापित करना चाहते हैं, तो लुई ने सहायक इंस्टॉलेशन नोट्स लिखे हैं

Wheeeeee!


1
मैंने एक ऐसा संस्करण बनाया है, जिसके लिए bash की आवश्यकता नहीं है, लेकिन जो किसी भी POSIX अनुरूप शैल github.com/chilicuil/ffcast
जेवियर लोपेज़

2
ऐसा लगता है कि कमांड लाइन के सिंटैक्स ffcastमें बदलाव आया है: github.com/lolilolicon/FFcast/issues/8
जैक ओ'कॉनर

1
ऐसा करने का सबसे सरल तरीका अब है ffcast -s rec [filename], हालांकि यह सटीक सेटिंग्स नहीं देता है जो आप अपने उदाहरण में उपयोग कर रहे हैं। दुर्भाग्य से, सटीक सेटिंग्स देने के लिए, अब आपको पूरी ffmpegकमांड देनी होगी । इस उत्तर को अद्यतन करने के सर्वोत्तम तरीके के बारे में आपका कॉल :)
जैक ओ'कॉनर

4
जीएच पर टिप्पणियों के आधार पर, ffcast -s % ffmpeg -f x11grab -show_region 1 -framerate 20 -video_size %s -i %D+%c -codec:v huffyuv -vf crop="iw-mod(iw\\,2):ih-mod(ih\\,2)" $TMP_AVIचाल करने के लिए लगता है।
BenC

1
किसी और के लिए इनमें से कुछ की स्थापना पर कुछ नोट इनके बिना पहले से ही अपने सिस्टम पर
लुई मैडॉक्स

11

मेरे लिए, उत्तर को इस तरह से उपयोग ffcastकरना था ffmpeg:

ffcast -w % ffmpeg -f x11grab -show_region 1 -framerate 20 -video_size %s -i %D+%c -codec:v huffyuv -vf crop="iw-mod(iw\\,2):ih-mod(ih\\,2)" out.avi

मैं तब ffmpegएवीआई से जीआईएफ में रूपांतरण करता था - यह बहुत तेज़ है और इससे फ्रैमर्ट बरकरार रहता है:

ffmpeg -i out.avi -pix_fmt rgb24 out.gif

अंत में मैंने gif को ऑप्टिमाइज़ करने के लिए @anko के उत्तर के रूप में उसी तरह से कन्वर्ट का उपयोग किया , लेकिन मैंने संदेश के convertसाथ बाहर निकलने को रोकने के लिए संसाधन उपयोग पर एक सीमा निर्धारित की killed, और मैंने देरी को हटा दिया जैसा ffmpegकि पहले ही संभाला है:

convert -limit memory 1 -limit map 1 -layers Optimize out.gif out_optimised.gif


2

मेरे सेटअप (ubuntu 16.04) के लिए, ffcast बहुत अच्छी तरह से काम नहीं करता है क्योंकि यह काफी समय से जीथब पर अपडेट नहीं किया गया है।

इसलिए मैंने स्लोप ( https://github.com/naelstrof/slop ) और ffmpeg का उपयोग करके एक स्क्रिप्ट लगाई ।

एक उदाहरण:

यह काम कर रहा है

#!/bin/bash

read -r X Y W H G ID < <(slop -f "%x %y %w %h %g %i")
TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)

ffmpeg -s "$W"x"$H" -y -f x11grab -i :0.0+$X,$Y -vcodec 
huffyuv -r 25 $TMP_AVI \
&& convert -set delay 5 -layers Optimize $TMP_AVI out.gif 

1

मैंने इस कारण से यूनिक्स डेस्कटॉप के लिए एक इंटरैक्टिव रैपर स्क्रिप्ट लिखी थी, और उपयोग के एक साल बाद, मैं इसे वहां साझा करने के लिए खुश हूं!

के साथ बनाया गया byzanz, gifsicle, xdotool, और लिपि में लिखी जाती है php

उदाहरण आउटपुट:

[1020px, नहीं आकार दिया gif चौड़ाई 1020px, 70 सेकंड, 50 रंग, 65kb ]

यहाँ छवि विवरण दर्ज करें

यह अच्छा संकुचित gif प्रदान करता है, और इस प्रश्न के लिए एक अच्छा प्रदर्शन है।

यह एक काफी सरल आधार है, जो आपके द्वारा हैक किए जाने के लिए तैयार है।

कार्यशीलता : माउस पदों या फुलस्क्रीन, आकार, संपीड़न, रंग संपीड़न, रिवर्स / मर्ज, giphy.com कर्ल अपलोड पर Gif रिकॉर्ड।

10 सेकंड gif रिकॉर्ड शुरू करने के लिए: gif 10

एक ही पैरामीटर के साथ कई बार रिकॉर्ड करने के लिए: gif !

एक फुलस्क्रीन 5 सेकंड gif रिकॉर्ड शुरू करने के लिए: gif 5 --fullscreen

स्क्रिप्ट रनिंग, सुखद रिकॉर्डिंग खुद:

[ 45 सेकंड, चौड़ाई 645px, पूर्ण रंग, 976kb ]
यहाँ छवि विवरण दर्ज करें

पूरी 5kb स्क्रिप्ट:

#!/usr/bin/php

<?php
#> php xdotool byzanz gifsicle curl
#@ https://webdev23.github.io/gif/gif

echo "Usage: ./gif [time in seconds|!] [--fullscreen|-f]\n";
echo "--------------------------------------------------\n";
echo "Gif recorder tool\n";
echo "gif ! to call back last settings\n";
echo "Please move your mouse at the top left corner point\n";
echo "of the wanted gif area. Then press enter.\n";
echo "\n";

#~ Nico KraZhtest | 05/2017 | https://github.com/webdev23/gif
#~ Create fluid GIF's fastly
#~ You can set the gif record time as argument: ./gif 10
#~ Default record time is 1 seconde, or set it now:
   $recordTime = 1;
#~ ----------------

$t = @$argv[1];

$x1;$y1;$x2;$y2;$gw;$gh;$defc;$rw;

if (!isset($argv[1]) || @$argv[1] === "!") {
  $t = $recordTime;
}

if (@$argv[1] === "!") {
  $pos = file_get_contents("./.config/gif/pos");
  $pos = explode("\n", $pos);
  $x1 = $pos[0];
  $y1 = $pos[1];
  $x2 = $pos[2];
  $y2 = $pos[3];
  $gw = $pos[4];
  $gh = $pos[5];
  $t = $pos[6];
  @$GLOBALS['defc'] = $pos[7];
  @$GLOBALS['$rw'] = $pos[8];
   #~ echo $x1." ".$y1." ".$x2." ".$y2." ".$gw." ".$gh." ".$t." ".$defc." ".@$rw;
  }

else if (@$argv[2] === "fullscreen" || @$argv[2] === "--fullscreen" || @$argv[2] === "-f" || @$argv[2] === "f") {
  echo "############\nStarting fullscreen record\n";
  $fs = system("xdpyinfo  | grep 'dimensions:'");
  echo "\n";
  $fs = explode("    ",$fs);
  echo $fs[1];
  $fs = explode(" ",$fs[1]);
  echo $fs[0];
  $fs = explode("x",$fs[0]);
  echo $fs[0]."\n";
  echo $fs[1];
  $x1 = "0";
  $y1 = "0";
  $x2 = "fs";
  $y2 = "fs";
  $gw = $fs[0];
  $gh = $fs[1];
  $t = $argv[1];
  system("mkdir -p ./.config/gif/");
  system("cd ./.config/gif/ && \
          echo '$x1\n$y1\n$x2\n$y2\n$gw\n$gh\n$t\n\n\n\n' > pos");
  }

else {
  $stdin = fopen('php://stdin', 'r');
  $response = rtrim(fgets(STDIN));

  $p1 = system("xdotool getmouselocation");

  $pos1 = explode(" ",$p1);

  $x1 = $pos1[0];
  $x1 = explode(":",$x1);
  $x1 = $x1[1];
  echo "X1: ".$x1;

  $y1 = $pos1[1];
  $y1 = explode(":",$y1);
  $y1 = $y1[1];
  echo " Y1: ".$y1;

  echo "\nNow move your mousse at the bottom right corner.\nThen enter\n";

  $stdin = fopen('php://stdin', 'r');
  $response = rtrim(fgets(STDIN));

  $p2 = system("xdotool getmouselocation");

  $pos2 = explode(" ",$p2);

  $x2 = $pos2[0];
  $x2 = explode(":",$x2);
  $x2 = $x2[1];
  echo "X2: ".$x2;

  $y2 = $pos2[1];
  $y2 = explode(":",$y2);
  $y2 = $y2[1];
  echo " Y2: ".$y2;

  $gw = ($x2 - $x1);
  echo "\nGif width: ".$gw;

  $gh = ($y2 - $y1);
  echo "\nGif height: ".$gh;
  echo "\n".$x1." ".$y1." ".$x2." ".$y2." ".$gw." ".$gh." ".$t."\n";

  system("mkdir -p ./.config/gif/");
  system("cd ./.config/gif/ && \
          echo '$x1\n$y1\n$x2\n$y2\n$gw\n$gh\n$t\n\n\n\n' > pos");
  }

$unix = date_timestamp_get(date_create());

echo "\n".$unix." | Starting ".$t."s gif record\n";

@system("byzanz-record \
        -v             \
        --duration=$t  \
        --x=$x1        \
        --y=$y1        \
        --width=$gw    \
        --height=$gh   \
        ~/Pictures/gif$unix.gif");

$named = "gif".$unix;

echo "Saved as ~/Pictures/".$named.".gif\n";

echo "\nOptimize | How many colors to keep? (default 100, max 256) \n";

if (@$argv[1] === "!"){
  $pos = file_get_contents("./.config/gif/pos");
  $pos = explode("\n", $pos);
  $defc = $pos[7];
  }

if (!isset($defc)){
  $defc = readline("Colors: ");
  }

if (empty($defc)){
  $defc = "100";
  }

echo "\nKeeping ".$defc." colors\n";

system("gifsicle --verbose -i ~/Pictures/$named.gif -O5 --colors=$defc -o ~/Pictures/$named\_reduced.gif");

echo "\nOptimize | Resize width in pixels (default 360px) \n";

if (@$argv[1] === "!"){
  $pos = file_get_contents("./.config/gif/pos");
  $pos = explode("\n", $pos);
  $rw = $pos[8];
  }

if (!isset($rw)){
  $rw = readline("Width : ");
  }

if (empty($rw)){
  $rw = "360";
  }

echo "\nResized by ".$rw." pixels width\n";

@system("gifsicle --verbose -i ~/Pictures/$named\_reduced.gif --resize-width $rw -o ~/Pictures/".$named."_optimized.gif");

$opt = "~/Pictures/".$named."_optimized.gif";

usleep(5000000);

echo "\nSpecial | Reverse and merge?\n";

system("xdg-open ~/Pictures/".$named."_optimized.gif > /dev/null");

if (@$argv[1] === "!"){
  $pos = file_get_contents("./.config/gif/pos");
  $pos = explode("\n", $pos);
  $rev = $pos[9];
  }

if (!isset($rev)){
  $stdin = fopen('php://stdin', 'r');
  $rev = rtrim(fgets(STDIN));
  $rev = "1";
  }

if (!isset($rev)){
  $rev = "0";
  }

@system("cd ./.config/gif/ && sed -i '8s/.*/$defc/' pos");
@system("cd ./.config/gif/ && sed -i '9s/.*/$rw/' pos");
@system("cd ./.config/gif/ && sed -i '10s/.*/$rev/' pos");

if ($rev === "1"){
  @system("gifsicle                           \
            -i ~/Pictures/$named\_reduced.gif \
            '#-2-1'                           \
            -o ~/Pictures/".$named."_reversed.gif");

  $inv = "~/Pictures/".$named."_reversed.gif";

  usleep(400000);

  @system("gifsicle                           \
            -i ~/Pictures/$named\_reduced.gif \
          --append $inv                       \
          --resize-width $rw                  \
          -o ~/Pictures/".$named."_merged.gif");

  usleep(3000000);

  system("xdg-open ~/Pictures/".$named."_merged.gif > /dev/null");

  }

echo "\n####################";
echo "\nUpload to giphy.com?\n";

$stdin = fopen('php://stdin', 'r');
$response = rtrim(fgets(STDIN));

$m = "~/Pictures/".$named."_merged.gif";
$f = system("du -h $m");
$f = explode("  ",$f);
$f = $f[1];

$www = system('curl                         \
                --progress-bar              \
                -v                          \
                -F "file=@'.$f.'"           \
                -F "api_key=dc6zaTOxFJmzC"  \
                "http://upload.giphy.com/v1/gifs"');

$www = json_decode($www);

echo "\n\nhttps://i.giphy.com/".$www->data->id.".gif\n";

echo "\nThanks YOU!\n";

कलात्मक सामान बनाने के लिए, रिवर्स / मर्ज क्षमता।

मूल (435kb)

यहाँ छवि विवरण दर्ज करें

उलट, विलय: (826kb)

यहाँ छवि विवरण दर्ज करें

स्थापित करने के लिए, phi का उपयोग कर :

php <(curl https://webdev23.github.io/phi/phi) install https://webdev23.github.io/gif/gif

पूर्ण स्क्रीन:

[1920 * 1080px, gif 400px, 50 सेकंड , 100 रंग, 2Mb ]

यहाँ छवि विवरण दर्ज करें

स्रोत, कुछ और स्पष्टीकरण और संभावित अपडेट के साथ: https://github.com/webdev23/gif

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.