وقتی لینوکس به کمک وبلاگ نویسی میاد!(تولید اتوماتیک تصاویر متحرک)
سلام
مطلب قبلیی که اینجا نوشتم پر بود از تصاویر gif. دو مطلب قبل تر هم به همین صورت بودش و چند تصویر gif در خودش داشت. مطلب قبلی، شامل سه تصویر متحرک بود اما برای تاپیک جدید، نیاز بود که لااقل ۳۰ تصویر گیف داشته باشم و بعدش احتمال میدادم که لازم باشه برخی قسمتهاش رو حذف کنم! بنابراین زحمتی بود که به هدر میرفت.
تهیه فیلمها به خودی خود بعد از نگارش مطلب خسته کننده بود، حالا پروئه خسته کننده و البته طولانی( به علت سخت افزار ضعیف من!) برای تبدیل فیلمها به تصویر متحرک نورعلی نور بود!
خوب اگر روی یه سیستم ویندوزی باشید، احتمالا یه کانورتر روی سیستم دارید که کل فیلمها رو توی grid اش میکشید و بعد یه دگمه میزنید که همه تبدیل بشه! ولی خوب، این کار حال نمیده!!
راه حل خیلی سادههست!! اتوماتیک کردن کارهای خسته کننده لینوکسی!!!
همیشه با این عنوان، کتاب میخونیم یا فیلم دانلود میکنیم و میبینیم برای اموزش برنامه نویسی ویا اسم یکی از فصل های کتابهای اموزش لینوکسه!
تلاشهای من برای نوشتن یه اسکریپت کوچیک که به جای من کار تولید تصاویر متحرک رو انجام بده خنده داره!! مراحلش رو با هم میبینیم
خوب، اول از همه باید بدونیم که میخوایم چیکار کنیم!! ما یه کاری رو توی ترمینال داریم انجام میدیم.
ffmpeg -i video.mp4 video.gif
حالا من میخوام این کد رو برای یه لیست ۳۰ تایی از فایل ها اجرا بکنم! خیلی مشخصه! باید یه حلقه for اجرا بکنم و تمام.
بین زبان پایتون و برنامه نویسی این کار و نوشتن یه اسکریپت ساده شل، من شل اسکریپت رو انتخاب میکنم!!
مرحله اول: کل فایل فایلهای مورد نظر باید توی یک پوشه باشن!
مرحله دوم: توی ادیتور متن مورد علاقمون شروع میکنیم به کد زدن! اینجا، من باید وارد ایمکس میشدم ولی سه خط کد که دیگه این حرفا رو نداره!! :) پس نانو کارم رو راه میندازه! (راستش خیلی دوست داشتم که سطح اشناییم و علاقهام به VIM در حدی میبود که توی vim مینوشتم کد رو ولی خوب...
nano test.sh
من رو وارد محیط نانو میکنه!!
مرحله سوم: من یه حلقه for میخوام پس مینویسم:
for file in *.mp4; do
خوب، سینتکس شل اسکریپت برای کسانی که باهاش اشنایی ندارن یه خورده یه جوریه ولی خوب!
حالا مسئله اصلی شروع میشه... همینجوری که میبینید، توی این کد من میخوام از بین تمام فایلهایی که اسمشون به .mp4 ختم میشه یکی یکی اونها رو به اسم file مورد پردازش قرار بدم....
مرحله چهارم: اینجا باید کدی که تکرار میشه رو بنویسم:
ffmpeg -i $file -vf scale=300:-1 $file.gif
این کد، کاملا مشخصه و مثل کدی هست که به صورت عادی نوشته بودیم... file$ همون هر کدوم از فایلهای با نام منتهی mp4. رو میگیره و به عنوان فایل ورودی به دستور ffmpeg میده
سویچ vf- و در ادامه scale=300:-1 مشخص میکنه که خروجی باید گیفی با سایز عرضی ۳۰۰ پیکسل باشه.
در نهایت، من یه کار اماتوری میکنم!!! file$ که نام فایل هستش برای مثال video_01.mp4 رو با پسوند gif از خروجی میگیرم... بنابراین اسم فایل خروجی میشه video_01.mp4.gif!! میشد کمی کد بیشتر نوشت و مثلا اون mp4. رو حذف کنرد ولی خوب، ارزشش رو نداره و من میخوام سریع به نتیجه برسم!
مرحله چهارم: حلقه for رو تموم میکنم
done
حالا باید فایل رو ذخیره کنم که برای nano به این صورت هستش که باید C*X یا همون کنترل ایکس میگیریم و فایل رو ذخیره میکنیم.
برای اجرای فایل در ترمینال نیاز هست که دسترسی رو اصلاح کنیم و در ابتدای فایل نوتیشنی نوشته باشیم و کلی دردسر دیگه! ولی ما یه اسکریپت نوشتم که بی دردسر اجرابشه!! پس اجرای فایل میشه :
مرحله پنجم: برای اجرای فایل اسکریپت باید بنویسیم:
sh test.sh
حالا، مثل یه برنامه نویس لینوکسی خوب تکیه میدیم تا برناممون کارش رو بکنه و به جای ما همه فایل ها رو یکی یکی تبدیل به گیف کنه!
نتیجه نهایی این کدها، همون چیزی هست که در این پست میبینید.
همونجور که میبینید، قدری شطرنجی هست نتیجه که این طبیعی هست. روشی هست که این مسئله رو حل کرد. من اون روش رو به کار بردم ولی متاسفانه تلاش برای ادغام این روش دیگه(استفاده از پلت رنگ برای اصلاح رنگها) و تغییر سایز نافرجام موند و به دلیل نداشتن حوصله، سر به سرش نذاشتم! پیشنهاد میکنم اگر شما روشی رو بلد هستید که این مسئله رو حل بکنه به منم بگید که اصلاح کنم! :)
کدی که خطا داد به دلیل ادغام دو روش:
for file in *.mp4; do
ffmpeg -i $file -vf palettegen $file.png
ffmpeg -i $file -vf scale=300:-1 $file.png -lavfi paletteuse $file.gif
done
این کد به دلیل تلاش برای ادغام دو روش اصلاح رنگ به روش پلترنگ خارجی و تغییر سایز تصویر خروجی، کار نکرد که اگر کسی راهحلی براش داره ممنون میشم بگه چون از این به بعد قراره کلی تصویر متحرک درست کنم.
کد نهایی که کار کرد و استفاده کردم:
for file in *.mp4; do
ffmpeg -i $file -vf scale=300:-1 $file.gif
done
- دوشنبه, ۲۲ شهریور ۱۳۹۵، ۱۰:۵۰ ب.ظ