2 คะแนน โดย GN⁺ 2025-12-28 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เครื่องมือ CLI ที่พัฒนาด้วย Node.js ซึ่งทำให้สามารถ รันคำสั่ง ffmpeg ด้วยภาษาอังกฤษแบบข้อความธรรมดา ได้ และตัดต่อวิดีโอด้วยประโยคง่าย ๆ โดยไม่ต้องใช้ตัวเลือกที่ซับซ้อน
  • เมื่อพิมพ์ คำสั่งในรูปประโยค เช่น ff convert video.mp4 to gif ระบบจะแปลงเป็นคำสั่ง ffmpeg และรันให้อัตโนมัติ
  • รองรับงานหลากหลาย เช่น แปลงฟอร์แมต, บีบอัด, ตัดช่วง, แยกเสียง, ปรับขนาด, ปรับความเร็ว, หมุน, รวมไฟล์ และอื่น ๆ
  • สามารถใช้ ตัวเลือก --dry-run เพื่อตรวจดูคำสั่ง ffmpeg ล่วงหน้าได้โดยไม่ต้องรันจริง
  • ทำงานออฟไลน์ได้อย่างรวดเร็ว โดยไม่ต้องใช้อินเทอร์เน็ตหรือ AI และใช้งานได้บนสภาพแวดล้อมที่ติดตั้ง ffmpeg พร้อม Node.js 16 ขึ้นไป

ภาพรวม

  • ezff คือ wrapper ที่ใช้ภาษาอังกฤษแบบข้อความธรรมดา ซึ่งสร้างขึ้นเพื่อให้ใช้งาน ffmpeg ได้ง่ายขึ้น
    • ผู้ใช้ไม่จำเป็นต้องจำแฟลก ffmpeg ที่ซับซ้อนหรืออ่านคู่มือ เพียงป้อนคำสั่งในรูปภาษาธรรมชาติ
    • ตัวอย่าง: ff convert video.mp4 to gif → สร้างและรันคำสั่ง ffmpeg โดยอัตโนมัติ
  • ต้องใช้ Node.js 16 ขึ้นไป และ ติดตั้ง ffmpeg โดยสามารถติดตั้งผ่าน npm ด้วย npm install -g ezff

ฟีเจอร์หลัก

  • มี โหมด interactive prompt
    • หากพิมพ์เพียงคำสั่ง ff ระบบจะถามทีละขั้นเกี่ยวกับพาธไฟล์ ประเภทงาน และฟอร์แมตผลลัพธ์
    • ตัวอย่าง:
      ? File path: video.mp4  
      ? What do you want to do? › Convert format  
      ? Convert to: › GIF  
      
    • หลังเลือกแล้ว ระบบจะสร้างและรันคำสั่ง ffmpeg ให้อัตโนมัติ
  • รองรับ โหมดป้อนคำสั่งโดยตรง
    • ผู้ใช้สามารถพิมพ์งานที่ต้องการเป็นบรรทัดเดียวได้
    • ตัวอย่าง:
      • ff convert video.mp4 to mp3
      • ff compress video.mp4 to 10mb
      • ff trim video.mp4 from 0:30 to 1:00
      • ff resize video.mp4 to 1280x720
      • ff speed up video.mp4 by 2x

รายการงานที่รองรับ

  • แปลง (Convert) : เปลี่ยนฟอร์แมต (mp4 → gif, mp4 → mp3)
  • บีบอัด (Compress) : กำหนดขนาดไฟล์เป้าหมาย (10mb เป็นต้น)
  • ตัดช่วง (Trim) : ดึงเฉพาะช่วงที่ต้องการ (from 0:30 to 1:00)
  • แยกเสียง (Extract audio) : แยกเฉพาะเสียงออกจากวิดีโอ
  • ปรับขนาด (Resize/Scale) : เปลี่ยนความละเอียด (1280x720, 720p)
  • ปรับความเร็ว (Speed up / Slow down) : เปลี่ยนความเร็วการเล่น (2x)
  • รองรับงานอีกหลากหลาย เช่น ย้อนกลับ (Reverse), ปิดเสียง (Mute), หมุน (Rotate), พลิกภาพ (Flip), สร้างภาพขนาดย่อ (Thumbnail), รวมไฟล์ (Merge), ขาวดำ (Grayscale), ลดนอยส์ (Denoise), กันสั่นวิดีโอ (Stabilize) เป็นต้น

ดูตัวอย่างคำสั่งและผลลัพธ์

  • ใช้ ตัวเลือก --dry-run เพื่อแสดงเฉพาะคำสั่ง ffmpeg โดยไม่รันจริงได้
    • ตัวอย่าง:
      ff convert video.mp4 to gif --dry-run  
      → ffmpeg -i video.mp4 -vf fps=15,scale=480:-1:flags=lanczos -loop 0 -y video_output.gif
      
  • ไฟล์ผลลัพธ์จะถูกบันทึกไว้ในโฟลเดอร์เดียวกับไฟล์ต้นฉบับ โดยเติมคำต่อท้าย _output (video_output.gif)

โครงสร้างการทำงานภายใน

  • Parser วิเคราะห์ประโยคอินพุตเพื่อดึงการกระทำ (action), ไฟล์ (file), ตัวเลือกต่าง ๆ (เช่น size)
  • Builder จับคู่ข้อมูลดังกล่าวให้เป็นคำสั่ง ffmpeg
  • ffmpeg เป็นตัวรันคำสั่งจริง
  • กระบวนการทั้งหมด ทำงานแบบออฟไลน์ด้วยการจับคู่รูปแบบ โดยไม่มีการเรียก AI หรือ API

การติดตั้งและสภาพแวดล้อม

  • ต้องใช้ Node.js 16 ขึ้นไป
  • ต้องติดตั้ง ffmpeg ไว้ใน PATH ของระบบ
    • macOS: brew install ffmpeg
    • Ubuntu/Debian: sudo apt install ffmpeg
    • Windows: choco install ffmpeg
  • เผยแพร่ภายใต้ สัญญาอนุญาต MIT และยินดีรับ Pull Request

สรุป

  • ezff คือ เครื่องมือ CLI แบบเรียบง่ายที่ช่วยลดภาระในการเรียนรู้คำสั่ง ffmpeg
  • สามารถ ทำงานตัดต่อวิดีโออัตโนมัติได้ด้วยการป้อนภาษาอังกฤษแบบข้อความธรรมดา
  • ด้วย การทำงานออฟไลน์ ความเร็วสูง และฟีเจอร์ที่หลากหลาย จึงเป็นเครื่องมือที่มีประโยชน์ทั้งสำหรับนักพัฒนาและผู้เริ่มต้นตัดต่อวิดีโอ

1 ความคิดเห็น

 
GN⁺ 2025-12-28
ความเห็นจาก Hacker News
  • น่าทึ่งที่ผู้คนพยายามแค่ไหนเพื่อจะไม่ต้องจำ วิธีใช้ ffmpeg พื้นฐาน
    จริง ๆ แล้ว ffmpeg ไม่ได้ยากขนาดนั้น และคู่มือก็อธิบายแนวคิดหลักไว้ค่อนข้างดี
    แน่นอนว่าค่าตั้งต้นมีจุดอันตราย เช่น ทำให้เกิดการเข้ารหัสใหม่หรือเก็บไว้แค่สตรีมเดียว แต่ถ้าจำ -c copy ได้ ส่วนใหญ่ก็ไม่มีปัญหา
    การซ่อน “จุดอันตราย” พวกนี้อาจยิ่งสร้างปัญหาใหญ่กว่าเดิม เช่น “ff convert video.mkv to mp4” ทั้งที่จริงแค่ remux ก็พอ กลับไปเข้ารหัสใหม่ทั้งไฟล์
    “ffmpeg extract audio from video.mp4” ก็อาจบังคับเข้ารหัสเป็น mp3 ใหม่เสมอจนคุณภาพลดลง
    มัลติมีเดียเป็น โดเมนที่ซับซ้อน โดยธรรมชาติ ดังนั้นถ้าซ่อนความซับซ้อนนี้ ผู้ใช้ก็จะเรียนรู้แนวคิดผิด ๆ
    ผมคิดว่าการ สอน ผู้ใช้ด้วยชีตสรุปดี ๆ น่าจะถูกทางกว่าการทำ wrapper แบบย่อส่วน

    • ต้องระวังเวลาพูดว่า “ไม่ได้ยากขนาดนั้น” เพราะแต่ละคนรู้สึกว่ายากไม่เหมือนกัน
      มันทำให้นึกถึงการถกเถียงแนว “แล้วทำไมคนจนไม่ไปหางานดี ๆ ล่ะ”
      ถึงอย่างนั้นก็เข้าใจว่าคุณพูดเพื่อสร้างแรงจูงใจ
    • ผมเองก็ใช้ ffmpeg ปีละครั้ง กว่าจะจำไวยากรณ์ได้หมดคงต้องอีกราว 350 ปี
    • สำหรับคนที่ใช้บ่อยก็คงง่าย แต่สำหรับคนอย่างผมที่ใช้แค่เดือนหรือสองเดือนครั้ง มันรู้สึกว่ายาก
      สิ่งที่ผมต้องการคือ สคริปต์แบบโต้ตอบได้ ที่ถามว่า “อยากทำอะไร” แล้วสร้างคำสั่งให้พร้อมอธิบายความหมายของแต่ละอาร์กิวเมนต์
    • คำว่า “ไม่ได้ยากขนาดนั้น” ฟังดูเหมือนมุกตลก เพราะ ffmpeg มีตัวเลือกเป็นพัน ๆ ตัว
      ตัวอย่างรายการตัวเลือก
    • ผมเองก็มักพูดว่าแนวคิดเรื่อง Python packaging “ไม่ได้ยากขนาดนั้น” แต่คำสั่ง ffmpeg ให้ความรู้สึกเหมือนเป็น ภาษาเฉพาะของตัวเอง
      ปัญหาที่คุณพูดถึงน่าจะแก้ได้ด้วยบั๊กรายงานหรือข้อเสนอฟีเจอร์
      การซ่อนค่าคุณภาพอาจมีเจตนาเพื่อให้ผู้ใช้ไม่ต้องกังวลเรื่องนั้น
      การหลีกเลี่ยงการเข้ารหัสใหม่ในการแปลงคอนเทนเนอร์อย่างเดียวก็น่าจะจัดการได้ด้วยตารางแมปปิง
      ช่วงหลังผมก็เพิ่งรู้สึกถึงการขาดแมปปิงแบบนี้ตอนทำงานดึงเสียงกับใส่ภาพปก
  • เวลาแปลงวิดีโอเป็น gif ผมใช้ ฟิลเตอร์ palettegen ตลอด
    พร้อมดูคำสั่งตัวอย่างจากบล็อกโพสต์ที่เกี่ยวข้องเมื่อ 10 ปีก่อน

    • ทุกวันนี้คำว่า “gif” มักถูกใช้ผิด ๆ บ่อยมาก ที่จริงแล้ว mp4 มีประสิทธิภาพกว่า
      เวลาใช้ animation gif บนเว็บ ถ้าเปลี่ยนเป็น mp4 จะได้ไฟล์เล็กกว่า ลื่นกว่า และสีตรงกว่า
    • ถ้ารวม pngquant เข้ากับ ffmpeg filter ได้ ก็น่าจะสร้างพาเลตที่ดีกว่าเดิม
      แบบนั้น ffmpeg อาจขึ้นไปใกล้ระดับ gifski ได้
    • สงสัยว่า ffmpeg เพิ่มการรองรับพาเลตแยกตามเฟรมหรือยัง
      เมื่อก่อน gifski ให้คุณภาพดีกว่าที่ขนาดไฟล์เท่ากันก็เพราะฟีเจอร์นี้
    • gifski เป็นทางเลือกที่ดี เพราะจัดการเรื่องพาเลตได้ดี
    • เสียดายที่ค่าพวกนี้ไม่ได้เป็นค่าเริ่มต้น
  • ผมชอบแนวทางนี้ อยากให้มี OS ที่ทำให้ CLI ของลินุกซ์ทั้งระบบเป็นมิตรกับมนุษย์มากขึ้น
    แทนคำสั่งกระจัดกระจายอย่าง tar, dd ก็อยากได้ CLI ที่สม่ำเสมอและอิงภาษาธรรมชาติ
    เช่น:

    zip my-folder into my-zip.tar with compression level 9  
    write my-iso ./zip.zip onto external hard drive  
    git delete commit 1a4db4c  
    convert ./video.mp4 and ./audio.mp3 into ./out.mp4  
    merge ./video.mp4 and ./audio.mp3 to ./out.mp4 without re-encoding
    

    ถ้ารองรับการเติมคำอัตโนมัติและการพูดได้หลายแบบก็คงดี ไม่จำเป็นต้องถึงขั้น LLM

    • แต่คำสั่งภาษาธรรมชาติแบบนี้มีปัญหาเรื่อง ความกำกวม
      จะเกิดสถานการณ์แบบ “ไม่ใช่ฮาร์ดดิสก์ลูกนั้น เอาอีกลูก!” หรือ “บอกให้ลบ หมายถึงลบถาวรจริง ๆ เหรอ?”
    • ถ้าไม่ชอบแนวทางแบบนั้นก็ใช้ Windows หรือ macOS ก็ได้
      ผมชอบที่ Linux ยังรักษาคุณลักษณะทางเทคนิคของมันไว้ตามเดิม
    • มี สคริปต์ helpme ที่ทำไอเดียนี้จริงแล้ว
      เช่น:
      helpme ffmpeg assemble all the .jpg files into an .mp4 timelapse video at 8fps
      helpme zip my-folder into my-zip.tar with compression level 9
      helpme git delete commit 1a4db4c
      
      เดิมเริ่มจากเป็น wrapper ของ ffmpeg แต่ตอนนี้พัฒนาเป็นผู้ช่วย CLI ทั่วไปแล้ว
  • ประโยชน์อย่างเดียวของ AI chatbot คือ เขียนคำสั่ง ffmpeg
    คุยไปมาเพื่อให้ได้คำสั่งที่ต้องการ แล้วอันที่ใช้บ่อยก็เซฟเป็นไฟล์ .command

    • LLM คือความก้าวหน้าที่น่าทึ่งในแง่การ parse ภาษาธรรมชาติ
      ปัญหาคือหลายคนดันเข้าใจผิดว่ามีแค่ Wikipedia กับข้อมูลอีกนิดหน่อยก็สร้าง “ปัญญา” ได้แล้ว
    • แม้จะมองในแง่ร้าย แต่ LLM ก็มีประโยชน์ในการ แปลงคำอธิบายข้อความของผู้ใช้เป็นคำสั่งหรือ SQL
      แต่ควรเป็น อินเทอร์เฟซแบบติวเตอร์ ที่แสดงผลลัพธ์ให้ผู้ใช้ตรวจสอบและเรียนรู้ไปด้วย
    • AI ยุคก่อนเคยจัดการเอฟเฟกต์ bounce แบบ “เล่นวิดีโอ 0:00~0:03 แล้วเล่นย้อนกลับวนซ้ำ” ได้ไม่ดี
    • ถึงอย่างนั้น อินเทอร์เฟซแบบนี้ก็ดูเป็นตัวอย่างของความสิ้นเปลืองที่ใช้ทรัพยากร GPU เกินจำเป็น
      เพราะแค่มี wrapper ง่าย ๆ สำหรับ ffmpeg ก็แก้ปัญหาได้ 90% แล้ว
  • เข้า คลัง GitHub ของ ezff ไม่ได้

    • ของผมก็ขึ้น 404 เหมือนกัน น่าจะเป็นปัญหาที่ลิงก์ด้านล่างของหน้า npm
    • แต่ยังดูได้จาก แท็บโค้ดของ npm
  • น่าจะใช้ LLM เพื่อดูตัวเลือกที่เสนอมาแล้วค่อยแก้ไขอีกที
    แต่มีปัญหา ชื่อแพ็กเกจชนกัน เลยควรใช้ชื่ออื่นจะดีกว่า
    ค้นหา “ezff” จะเจอไลบรารี Python ส่วน “ez-ffmpeg” เป็นไลบรารีสำหรับ Rust

  • LLM เป็นอินเทอร์เฟซสำหรับ ffmpeg ที่ยอดเยี่ยม
    อาจต้องแก้ 2~3 รอบในเรื่องอย่างการซิงก์ซับไตเติล แต่ก็ สร้างคำสั่งซับซ้อนได้เร็ว

  • ผมสงสัยคำอธิบายที่ว่า “20 รูปแบบทั่วไปครอบคลุม 90%”
    อยากรู้ว่านี่เป็นคำพูดของ AI หรือผู้เขียนพูดเอง

  • npm เหรอ? พอเห็น เหตุการณ์ด้านความปลอดภัย ที่ระเบิดขึ้นแทบทุกสัปดาห์ ก็ไม่อยากเอาความวุ่นวายนั้นเข้ามาในสภาพแวดล้อมพัฒนาของตัวเอง

  • การเปลี่ยนพาราไดม์ที่ AI จะพามาคือ “การสั่งคอมพิวเตอร์ด้วยภาษาธรรมชาติ” ในที่สุด
    คำสั่งอย่าง “ช่วยทำฉากทำอาหารในหนังเรื่องนี้เป็น gif ให้หน่อย” จะกลายเป็นเรื่องจริง
    พาราไดม์แบบใช้คำสั่งในปัจจุบันกำลังมีชะตาที่จะหายไป

    • ถึงอย่างนั้น คุณค่า ของเครื่องมือที่สม่ำเสมอและผ่านการพิสูจน์แล้วก็ยังมีอยู่
      ไม่จำเป็นต้องดูแคลนความพยายามแบบนี้เลย