জিআইএফ স্ক্রিনকাস্টিং; ইউনিক্স উপায়


57

একটি নিতে স্ট্যাটিক স্ক্রিনশট আমার পর্দার একটি নির্বাচিত অংশ, আমি প্রায়ই ব্যবহার scrotসঙ্গে -s shot.png। স্ট্যাক এক্সচেঞ্জ পোস্টগুলিতে চিত্র যুক্ত করার জন্য এটি দুর্দান্ত। এমনকি আমি এই স্ক্রিপ্টটি ইমগুর ডটকম এ স্বয়ংক্রিয়ভাবে একটি স্ক্রিনশট আপলোড করতে এবং আমার এক্স ক্লিপবোর্ডে একটি লিঙ্ক স্থাপন করতে পেয়েছি!

আসুন এটিকে বারো পর্যন্ত পরিণত করুন : আমি কীভাবে একইভাবে একটি জিআইএফ স্ক্রিনকাস্ট তৈরি করব ?

সেখানে হয় মত প্রোগ্রাম recordmydesktop, byzanz& CO যেমন উবুন্টু জিজ্ঞাসা করুন আলোচিত যে, "ব্যবহারকারী বন্ধুত্বপূর্ণ" হতে লক্ষ্য রাখি কিন্তু আমার অভিজ্ঞতা বগী, অদক্ষ, সামান্য এককালীন কিছু ভালো জন্য বেশিরভাগ unscriptable এবং অনুপযুক্ত হয়।

আমি কেবল একটি অঞ্চল নির্বাচন করতে এবং একটি জিআইএফ রেকর্ড করতে চাই, একটি কনসোল কমান্ডের সাহায্যে আমি বুঝতে পারি, কিছু তীরচিহ্নহীন জিইআইআই মনস্ট্রোসিটি নয়।

কিভাবে আমি এটি করতে পারব?



2
টার্মিনাল সম্পর্কিত যে কোনও কিছুর জন্য, এটি আরও ভাল বিকল্প হতে পারে: asciinema.org
ফ্ল্যাটারন

উত্তর:


68

ঠিক আছে তাহলে

জিআইএফ ভিমকাস্ট!

আমি শুরু ffcast, হয়নি vim, প্রস্থান ffcast, তারপর convertইডি .avi.gif

আমি অন্য টার্মিনালে রেকর্ডিং কমান্ডগুলি চালিত করেছি। $PATHএই উত্তরের শেষে আপনার জন্য পালিশ করা স্ক্রিপ্ট ।

কি হলো?

ক্যাপচার

এফএফকাস্ট ব্যবহারকারীকে ইন্টারেক্টিভভাবে একটি স্ক্রিন অঞ্চল নির্বাচন করতে এবং স্ক্রিন রেকর্ডিংয়ের জন্য জ্যামিতিটি একটি বহিরাগত কমান্ড, যেমন এফএফপিপেগের কাছে হস্তান্তর করে helps

ffcastআর্চ লিনাক্স সম্প্রদায়ের (প্রধানত লোলিলিকন ) কিছু হ্যাকিংয়ের গৌরবময় পণ্য । আপনি এটা জানতে পারেন GitHub উপর (অথবা অর মধ্যে জন্য আর্চ পক্ষে)। এর নির্ভরশীলতার তালিকাটি কেবলমাত্র এবং যদিও আপনি ইন্টারঅ্যাকটিভ আয়তক্ষেত্র নির্বাচনের জন্য ( এআর লিঙ্ক ) চান ।bashffmpegxrectsel

আপনি ffmpegকমান্ডের ঠিক পরে পতাকাও যুক্ত করতে পারেন । আমি -r 15প্রতি সেকেন্ডে 15 ফ্রেম এবং -codec:v huffyuvলসলেস রেকর্ডিংয়ের জন্য ক্যাপচার করার জন্য সেট করেছি । (আকার / মানের ট্রেড অফের জন্য এইগুলি খেলুন))

GIFfing

করে ImageMagick পড়তে পারেন .aviভিডিও এবং কিছু জিআইএফ অপ্টিমাইজেশান ট্রিকস আয়তন বহুলাংশে ফাইল আকার হ্রাস যখন মানের সংরক্ষণের আছে: -layers Optimizeথেকে convertসাধারণ অপ্টিমাইজার ডাকে। ইমেজম্যাগিকের ম্যানুয়ালটিতে উন্নত অপ্টিমাইজেশনের একটি পৃষ্ঠা রয়েছে ।

চূড়ান্ত লিপি

এটি আমার মধ্যে যা আছে $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

সাম্প্রতিক আপডেটের পরে সঠিক পতাকাগুলি সনাক্ত করার জন্য গোয়েন্দা কাজের জন্য বেনিকে ধন্যবাদ ffcast

আপনি যদি একটি ডেবিয়ান ভিত্তিক ডিস্ট্রো উপর নির্ভরতা ইনস্টল করতে চান, তবে লুই লিখেছেন সহায়ক ইনস্টলেশন নোট

Wheeeeee!


1
আমি এমন একটি সংস্করণ তৈরি করেছি যার জন্য বাশ লাগবে না, তবে যিনি কোনও পসিক্স
জাভিয়ের লোপেজ

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কৌশলটি মনে হচ্ছে।
বেনসি 10

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

সর্বশেষে আমি একই ভাবে রূপান্তর ব্যবহৃত @anko এর উত্তর GIF নিখুত, কিন্তু আমি থামাতে রিসোর্স ব্যবহারের উপর একটি সীমা নির্ধারণ করে convertএকটি সঙ্গে থেকে প্রস্থান killedবার্তা, এবং আমি বিলম্ব মুছে যেমন ffmpegইতিমধ্যে যে ঘাঁটা করেছেন:

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

2

এই সংগ্রহস্থলটি আপনাকে নির্বাচন অঞ্চল থেকে আপনার জিআইএফ তৈরি করতে এবং এটি আপনার জন্য অনুকূল করে তুলতে সহায়তা করে

https://github.com/devlifeX/record-screen-gif


2

আমার সেটআপের জন্য (উবুন্টু 16.04), ffcast ভালভাবে কাজ করে না কারণ এটি বেশ কিছুক্ষণের জন্য গিথুবে আপডেট করা হয়নি updated

সুতরাং আমি opালু ( 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 রঙ, 65 কেবি পুনরায় আকার দেওয়া হয়নি ]

এখানে চিত্র বর্ণনা লিখুন

এটি ভাল সংকোচিত gifs সরবরাহ করে এবং এই প্রশ্নের জন্য এটি একটি ভাল শোকেস।

এটি মোটামুটি সহজ বেস, আপনার দ্বারা হ্যাক হওয়ার জন্য প্রস্তুত।

কার্যকারিতা : মাউস পজিশনে বা পূর্ণস্ক্রিনে জিআইএফ রেকর্ড, আকার পরিবর্তন, সংক্ষেপণ, রঙ সংক্ষেপণ, বিপরীত / মার্জ, জিপি ডট কম কার্ল আপলোড।

10 সেকেন্ডের জিআইএফ রেকর্ড শুরু করতে: gif 10

একই পরামিতিগুলির সাথে একাধিকবার রেকর্ড করতে: gif !

একটি পূর্ণ স্ক্রিন 5 সেকেন্ডের জিআইএফ রেকর্ড শুরু করতে: gif 5 --fullscreen

স্ক্রিপ্ট চলছে, আনন্দদায়কভাবে নিজেকে রেকর্ড করছে:

[ 45 সেকেন্ড, প্রস্থ 645px, পূর্ণ রঙ, 976 কেবি ]
এখানে চিত্র বর্ণনা লিখুন

সম্পূর্ণ 5 কেবি স্ক্রিপ্ট:

#!/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";

বিপরীতে / মার্জ করার ক্ষমতা, শৈল্পিক স্টাফ তৈরি করতে।

আসল (435 কেবি)

এখানে চিত্র বর্ণনা লিখুন

বিপরীত হয়েছে, একীভূত হয়েছে: (826 কেবি)

এখানে চিত্র বর্ণনা লিখুন

ইনস্টল করতে, ফাই ব্যবহার করে :

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.