Thursday, June 19, 2025

🎞️ ffmpeg ile Videodan Belirli Bir Alanı Kırpma (Crop)

Video işleme projelerinde, bazen bir videonun sadece belirli bir bölümünü saklamak ve kenarlardaki alanları atmak isteyebilirsiniz. Örneğin, dikey bir videoda sadece orta kısmı almak ya da sabit bir kameranın kadrajındaki sabit çerçeveyi izole etmek gerekebilir.

Bu yazıda, ffmpeg kullanarak bir videodan istediğiniz bölgeyi nasıl kırpabileceğinizi adım adım göstereceğim.

🔧 Gerekli Araçlar

  • ffmpeg — komut satırı tabanlı açık kaynak video işlem aracı

Ubuntu için:

sudo apt install ffmpeg

Windows kullanıcıları buradan indirip ffmpeg.exe'yi bir klasöre çıkarıp PATH'e eklemeli.

📐 Adım 1: Videonun Boyutunu Öğren

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4

Örnek çıktı:

1080,1918

Bu durumda videonun genişliği 1080 piksel, yüksekliği 1918 piksel.

🖼️ Adım 2: Almak İstediğiniz Bölgeyi Belirleyin

Diyelim ki videonun ortasındaki 864x1442’lik bir bölgeyi almak istiyorsunuz. Geri kalan her şey silinecek.

Kırpma için gereken x ve y değerleri (video ortalanacak şekilde):

x = (1080 - 864) / 2 = 108
y = (1918 - 1442) / 2 = 238

✂️ Adım 3: ffmpeg ile Kırpma İşlemi

ffmpeg -i input.mp4 -filter:v "crop=864:1442:108:238" -c:a copy output.mp4

Parametreler:

  • w: alınacak bölgenin genişliği
  • h: yüksekliği
  • x: videonun solundan itibaren başlangıç noktası
  • y: üstten itibaren başlangıç noktası

🎯 Alternatif: Dört Kenardan Kırpma Mantığı

Eğer her kenardan kırpılacak miktar belliyse, formül şu şekilde olur:

crop_w = width - left - right
crop_h = height - top - bottom
x = left
y = top

Örnek:

ffmpeg -i input.mp4 -filter:v "crop=1060:1868:10:20" -c:a copy output.mp4

🎁 Bonus: Tek Kare Alıp Görselde Ölçüm Yapmak

ffmpeg -i input.mp4 -frames:v 1 -q:v 2 -ss 00:00:01 frame.jpg

Bu görseli Paint veya GIMP ile açarak tam olarak hangi alanı almanız gerektiğini ölçebilirsiniz.

📌 Sonuç

ffmpeg'in crop filtresiyle videolardan yalnızca istediğiniz kısmı almak oldukça pratik ve güçlü bir yöntemdir. İster sabit bir kamera çerçevesi kırpın, ister estetik düzenlemeler yapın — doğru kullanıldığında zamandan ve disk alanından büyük tasarruf sağlar.

Friday, June 6, 2025

Xbox One Termal Macun Deneyimi

Geçtiğimiz günlerde Xbox One konsolumun termal macununu değiştirmeye karar verdim. Konsolda hiçbir sıkıntı yoktu, sırf çok uzun yıllardır el değmeden kullandığım için temizlik ve bakım yapasım geldi. Bu iş için önce elimde hazır bulunan kalitesiz, markasız bir macun kullandım Sonuç: Felaket.

Uygulama sonrasında fan bir anda çok yüksek devirde çalışmaya başladı. Konsol boşta bile sanki ağır oyun çalıştırıyormuş gibi ses çıkarıyordu. Dahası, fan çıkışından gelen hava  soğuktu. Yani işlemciden çıkan ısı heatsink’e doğru düzgün aktarılmıyordu. Heatsink neredeyse çalışmıyordu.

Bunun üzerine Arctic MX-4 aldım ve tekrar uyguladım ve konsol eski sessiz haline döndü. Bazen Netflix'te film izlerken, bazen Pacman'de bile çıldıran konsol artık RDR2'de bile fanı düşük hızlarda tutuyordu. En güzeli, artık fan çıkışından gelen hava sıcaktı. Bu da ısının olması gerektiği gibi heatsink'e ulaşabildiğini gösteriyordu.

Xbox One’ın APU yapısı (SoC), CPU ve GPU’nun birleşik olduğu karmaşık bir tasarıma sahip. Bu yüzden termal temas çok kritik. Kalitesiz bir termal macun, sistemin dengesini tamamen bozabiliyor. 

Ucuz termal macun kullanmak bana zaman ve huzur kaybettirdi. Sessizlik ve stabilite istiyorsanız, özellikle Xbox One gibi cihazlarda iyi bir termal macun kullanmak şart. Arctic MX-4 ya da benzeri kaliteli macunları tavsiye ederim.

Tuesday, June 3, 2025

WiZ Akıllı Ampulleri PC Üzerinden Kontrol Etmek (Python GUI Arayüzlü Uygulama)

WiZ markalı akıllı ampulleri (Signify/Philips) cep telefonu uygulaması yerine bilgisayardan kontrol etmek için Python tabanlı GUI uygulaması. Bu uygulama sayesinde aynı ağa bağlı WiZ ampulleri PC'den açmak ve kapatmak mümkün.




✨ Özellikler:

  • 3 farklı WiZ ampul için "Aç" ve "Kapat" butonları
  • Tüm ampulleri tek tuşta açıp kapama; "Hepsini Aç" / "Hepsini Kapat"
  • Tkinter tabanlı basit ve hızlı arayüz
  • Kod Python 3 ve pywizlight kütüphanesiyle yazıldı

📅 Gerekenler:

  • Python 3.8+
  • pywizlight kütüphanesi:

pip install pywizlight

Bilgisayar ile ampuller aynı ağda olmalı

⚙️ Kod:


import tkinter as tk
from tkinter import messagebox
import asyncio
from pywizlight import wizlight, PilotBuilder

# Ampul IP listesi, kendi senaryonuza göre düzenleyin
bulb_ips = ["192.168.1.104", "192.168.1.105", "192.168.1.106"]

class WizController:
    def __init__(self):
        self.loop = asyncio.new_event_loop()

    def turn_on(self, ip):
        self.loop.run_until_complete(self._turn_on(ip))

    def turn_off(self, ip):
        self.loop.run_until_complete(self._turn_off(ip))

    async def _turn_on(self, ip):
        try:
            bulb = wizlight(ip)
            await bulb.turn_on(PilotBuilder())
        except Exception as e:
            messagebox.showerror("Bağlantı Hatası", f"{ip} için hata: {e}")

    async def _turn_off(self, ip):
        try:
            bulb = wizlight(ip)
            await bulb.turn_off()
        except Exception as e:
            messagebox.showerror("Bağlantı Hatası", f"{ip} için hata: {e}")

app = tk.Tk()
app.title("WiZ Ampul Kontrol Paneli")
app.geometry("300x300")

controller = WizController()

for idx, ip in enumerate(bulb_ips):
    frame = tk.LabelFrame(app, text=f"Ampul {idx + 1} - {ip}", padx=10, pady=10)
    frame.pack(padx=10, pady=5, fill="x")

    btn_on = tk.Button(frame, text="Aç", width=10, command=lambda ip=ip: controller.turn_on(ip))
    btn_on.pack(side="left", padx=5)

    btn_off = tk.Button(frame, text="Kapat", width=10, command=lambda ip=ip: controller.turn_off(ip))
    btn_off.pack(side="left", padx=5)

bulk_frame = tk.Frame(app)
bulk_frame.pack(pady=15)

btn_all_on = tk.Button(bulk_frame, text="Hepsini Aç", width=12, command=lambda: [controller.turn_on(ip) for ip in bulb_ips])
btn_all_on.pack(side="left", padx=5)

btn_all_off = tk.Button(bulk_frame, text="Hepsini Kapat", width=12, command=lambda: [controller.turn_off(ip) for ip in bulb_ips])
btn_all_off.pack(side="left", padx=5)

app.mainloop()