หน้าเว็บ

วันศุกร์ที่ 24 เมษายน พ.ศ. 2569

ffmpeg คู่มือเข้ารหัสวิดีโอ H.264 (x264)

โหมดการควบคุมอัตราการส่งข้อมูล (Rate Control)

1. การควบคุมอัตราบิต (Rate Control)

หน้าเว็บเน้นย้ำ 2 โหมดหลักที่ต้องเลือกใช้ตามจุดประสงค์

  • Constant Rate Factor (CRF) - เน้นคุณภาพ:

    • หลักการ: เลือกคุณภาพที่ต้องการ แล้วให้ Encoder จัดการ Bitrate เองตามความยากง่ายของภาพ

    • ค่าที่ควรทราบ: สเกลคือ 0-51

      • 0: Lossless (ชัดเท่าต้นฉบับแต่ไฟล์ใหญ่มาก)

      • 17–18: Visually Lossless (ทางสายตาดูไม่ออกว่าต่างจากต้นฉบับ)

      • 23: ค่าเริ่มต้น

      • 28: คุณภาพยังดีอยู่แต่ไฟล์จะเล็กกว่า 23 มาก

    • สูตรคำนวณ: ถ้าเพิ่มค่า CRF ไป +6 ขนาดไฟล์จะลดลงประมาณครึ่งหนึ่ง ในทางกลับกันถ้าลด -6 ขนาดไฟล์จะใหญ่ขึ้นประมาณเท่าตัว

  • Two-Pass - เน้นขนาดไฟล์:

    • หลักการ: ต้องรันคำสั่ง 2 รอบ รอบแรกเพื่อวิเคราะห์วิดีโอ (สร้าง Log file) รอบที่สองเพื่อ Encode จริงให้ได้ขนาดไฟล์ตามที่คำนวณไว้เป๊ะๆ

    • วิธีคำนวณ Bitrate: (ขนาดไฟล์ที่ต้องการในหน่วย MiB * 8388.608) / ความยาววิดีโอเป็นวินาที = Bitrate รวม

2. การเลือก Preset และ Tune (หัวใจของ x264)

  • Presets (ความเร็ว vs ประสิทธิภาพ): ไล่จากเร็วสุดไปช้าสุด: ultrafast, superfast, veryfast, faster, fast, medium (Default), slow, slower, veryslow, placebo

    • สิ่งที่ควรรู้: ยิ่งใช้ Preset ช้าลง (เช่น slow หรือ slower) ตัว Encoder จะวิเคราะห์ภาพได้ละเอียดขึ้น ทำให้ได้คุณภาพวิดีโอดีขึ้นในขณะที่ขนาดไฟล์เท่าเดิม หรือได้ไฟล์เล็กลงในขณะที่คุณภาพเท่าเดิม

  • Tune (ปรับแต่งตามเนื้อหา):
    ใช้ตัวเลือก -tune เพื่อเปลี่ยนการตั้งค่าตามรายละเอียดของข้อมูลป้อนเข้าของคุณได้ การตั้งค่าปัจจุบันได้แก่

    • film: สำหรับหนังทั่วไป (รักษาความละเอียดของภาพ)

    • animation: สำหรับการ์ตูน (ใช้ deblocking มากขึ้นและ reference frames เยอะขึ้น)

    • grain: สำหรับหนังเก่าที่มี Noise/Grain เยอะ (รักษาความขลังของเนื้อฟิล์ม)

    • stillimage: สำหรับภาพนิ่งหรือสไลด์โชว์

    • zerolatency: สำหรับงานถ่ายทอดสดที่ต้องการความหน่วงต่ำที่สุด

3. ข้อมูลเชิงลึกด้าน Compatibility (การนำไปเปิดเล่น)

  • Profiles: ปกติ x264 จะเลือกให้เองอัตโนมัติ แต่ถ้าต้องส่งไฟล์ไปเล่นในอุปกรณ์เก่ามากๆ อาจต้องระบุ:

    • -profile:v baseline: สำหรับมือถือรุ่นเก่ามาก

    • -profile:v main: มาตรฐานทั่วไป

    • -profile:v high: อุปกรณ์สมัยใหม่ (แนะนำตัวนี้ถ้าไม่ได้ระบุอะไร)

  • Pixel Format: หาก Encode แล้วเปิดใน QuickTime หรือโปรแกรมเล่นวิดีโอทั่วไปไม่ได้ ให้เพิ่ม -pix_fmt yuv420p เข้าไปเสมอ เพราะอุปกรณ์ส่วนใหญ่รองรับแค่มาตรฐาน 4:2:0

4. ฟีเจอร์เสริมที่น่าสนใจ

  • Faststart for Web: การใส่ -movflags +faststart จะช่วยย้ายข้อมูล Header ไปไว้ส่วนหน้าของไฟล์ ทำให้วิดีโอบนเว็บกดปุ๊บเล่นปั๊บได้เลย (ไม่ต้องรอโหลดเสร็จทั้งไฟล์)

  • Hardware Acceleration: หน้าเว็บมีการเอ่ยถึงการใช้การ์ดจอช่วย (เช่น h264_nvenc ของ Nvidia หรือ h264_qsv ของ Intel QuickSync) ซึ่งจะทำงานได้เร็วมาก แต่คุณภาพต่อบิตอาจจะไม่กริบเท่าการใช้ CPU (libx264) รันเพียวๆ


ตัวอย่างคำสั่งแบบจัดเต็ม: ffmpeg -i input.mp4 -c:v libx264 -preset slower -crf 20 -tune film -pix_fmt yuv420p -movflags +faststart -c:a aac -b:a 192k output.mp4

ที่มา

https://trac.ffmpeg.org/wiki/Encode/H.264

วันศุกร์ที่ 9 พฤษภาคม พ.ศ. 2568

คำสั่ง ffmpeg สร้างวีดีโอจากภาพให้หมุนรอบ


ตัวอย่างคำสั่ง

ffmpeg -f lavfi -i color=c=ffffff:s=680x680:d=10 -loop 1 -i filename.png -filter_complex "[1]rotate=angle=PI*t:fillcolor=none:ow='hypot(iw,ih)':oh=ow[fg];[0][fg]overlay=x=(W-w)/2:y=(H-h)/2:shortest=1:format=auto,format=yuv420p" -movflags +faststart output.mp4

พารามิเตอร์

  • -f คือเรียกใช้ ไลบรารี lavfi
  • color=c=ffffff คือสีพื้นหลัง
  • s=680x680 คือขนาดของภาพ (กว้างxยาว)


clone คัดลอก วีดีโอเดียวต่อๆกันหลายครั้ง จากตัวอย่างด้านล่างให้วีดีโอแสดงต่อกัน 9 รอบ

ffmpeg -stream_loop 9 -i input.mp4 -c copy output.mp4

วันเสาร์ที่ 14 ธันวาคม พ.ศ. 2567

คำสั่ง adb ของแอนดรอยด์

adb shell input text "text"
adb shell input text "insert%syour%stext%shere"
adb push file /sdcard/Download

***

โหมด shell
adb shell

ปิดการเคลื่อนไหวของหน้าจอ

adb shell settings put global window_animation_scale 0
adb shell settings put global transition_animation_scale 0
adb shell settings put global animator_duration_scale 0

ถอนแอปที่ติดตั้งโดยผู้ใช้
adb shell "pm list packages -3 | cut -d':' -f2 | tr '\r' ' ' | xargs -r -n1 -t pm uninstall -k"

แสดง แอปทั้งหมดที่ติดตั้งทั้งหมด

adb shell pm list packages

แสดง แอปทั้งหมดที่ติดตั้งโดยผู้ใช้
adb shell pm list packages -3

แสดง แอปทั้งหมดที่ติดตั้ง ที่มีคำว่า google
adb shell pm list packages google

ใน shell โหมด แสดง แอปที่ติดตั้งที่มีคำว่า google
pm list packages | grep google

ถอนแอปที่ติดตั้ง
adb shell pm uninstall com.package_name
adb shell pm uninstall --user 0 com.google.android.apps.docs.editors.sheets

disable ปิดแอปที่ติดตั้ง

adb shell pm disable com.package_name

adb shell pm block com.package_name


enable เปิดแอปที่ติดตั้ง

adb shell pm enable com.package_name

adb shell pm unblock com.package_name

ดูเบอร์โทรในเครื่อง

adb shell "service call iphonesubinfo 18 | cut -c 52-66 | tr -d '.[:space:]+'"

เช็ค IMEI เครื่อง

adb shell " service call iphonesubinfo 3 i32 1 | cut -c 52-66 | tr -d '.[:space:]'"

adb shell "service call iphonesubinfo 4 | cut -c 52-66 | tr -d '.[:space:]'"


ติดตั้งแอป จาก apk ไฟล์ที่อยู่ใน folder Download

adb shell pm install /sdcard/Download/SmartTube_stable_25.08_armeabi-v7a.apk

ถอนแอปที่ติดตั้ง ไม่ลบ cache และ data ของแอป

adb shell pm uninstall -k com.package_name

Click the home button
adb shell input keyevent 3

ลบข้อความในช่อง input

adb shell input keyevent --longpress 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67


paste ข้อความลงช่อง text box

adb shell input keyevent 279


แสดงแอปที่ติดตั้งโดยผู้ใช้ (แอปที่ไม่ได้ติดตั้งจากโรงงาน)

adb shell pm list packages -3


เชื่อมต่อกับอุปกรณ์ตาม IP

adb connect 192.168.1.x:5555


ส่ง ข้อความลงช่อง text box

adb shell input text "liverpool"


ส่งไฟล์ลงเครื่องแอนดรอยด์ (ลงเมมและลงตัวเครื่อง)

adb push filename /sdcard/Download

adb push filename /storage/emulated/0/Download


ดู เลข ip อุปกรณ์ (ที่เสียบสาย)

adb shell ifconfig "| grep Mask"


บันทึกหน้าจอ (จบแล้วกด Ctrl+c)

adb shell screenrecord /sdcard/filename.mp4


สั่งให้ทำงานหรือหยุด

adb start-server
adb kill-server


adb shell settings list system
adb shell settings list global
adb shell settings list secure

วันจันทร์ที่ 9 กันยายน พ.ศ. 2567

เนื้อเพลง แพ้ใจตัวเอง - อ้อม ฑิฆัมพร

รักนี้ในใจเก็บซ่อนไว้เธอไม่รู้
ทั้งๆที่อยู่ เธอกับฉันยามชิดใกล้
สบตาหรือมอง และยิ้ม ให้เธอยังไม่กล้าดังใจ
ในบางครั้งฉันเองอยากพบความใน และพูดคุย
ใจ เพียงคิดเป็นความสับสนในใจ แต่ให้ เธอแล้ว
เป็นรักครั้งแรกที่มี ฉันให้เธอไป

คิดไว้ซักวัน ที่เรานั้นจะเข้าใจ
แต่ฉันก็ได้ แต่อาจคิดเพียงลำพัง
จะมีไหมวัน ที่ฉันเคียงเธอ และไม่ห่างจางใจ
มันเป็นคิดของคนที่หวัง รอคอย หวังคนเดียว
แม้วันนั้นจะวันสุดท้ายในเราก็ยอมหมด แล้ว
ยอมช้ำยามเธอบอกมา เดินห่างจางใจ

ทุกครั้งยามเธออยู่ใกล้ชิดเคียงข้างใคร
ฉันเผลอร้องไห้ แอบซ่อนไว้ในใจเดิม
ไม่เคยหาเพิ่ม ต่อรักให้ใคร รักเธออยูหนึ่งเดียว

เคยบางครั้งทำใจเข้มแข็ง มองเมินและไม่แล
เป็นเพราะฉันมีใจอ่อนแอเกินไป
แต่คงด้วยรัก คงเพราะรักเธอมากไป แพ้ใจตัวเอง

เคยบางครั้งทำใจเข้มแข็ง มองเมิน และไม่แล
เป็นเพราะฉันมีใจอ่อนแอเกินไป
แต่คงด้วยรัก คงเพราะรักเธอมากไป แพ้ใจตัวเอง

ลิงค์เพลงแพ้ใจตัวเองใน youtube
https://www.youtube.com/watch?v=1RyxzvZaBp4

ข้อมูลเพลง

  • ศิลปิน ฑิฆัมพร กิจสุขกาย ชื่อเล่น อ้อม
  • อัลบั้มที่ 2 (แพ้ใจตัวเอง)
  • ปีพ.ศ. กุมภาพันธ์ 2532
  • สังกัดค่าย RS
  • ผลงานเพลง : จำรัส เศตาภรณ์, อาจินต์ นิลเพชร, บรรเจิด สินธุ์ฉ่ำ, นิติ จิ๋วอยู่
  • เรียบเรียงดนตรี: ดีชัย เลิศวิริยะชัย

อีกเพลงเพราะที่ชอบในชุดนี้ .. เพลงเหินห่าง (เมื่อความรักจางเราจึงเหินห่าง...)


ภาพปักอัลบั้มหน้าและหลังจาก
http://barameepor.lnwshop.com

วันอาทิตย์ที่ 15 ตุลาคม พ.ศ. 2560

แก้ปัญหา Joomla! 3.x pagination limitstart=0

วิธีแก้ปัญหา Joomla version 3.x มี link เพิ่มขึ้นเมื่อกลับไปหน้าแรก จะมี Duplicate Links ?limitstart=0 ตามหลัง

แก้ไข 2 จุด ไฟล์ : /libraries/cms/pagination/pagination.php
ฟังก์ชัน protected function _buildDataObject


จุดที่ 1 (นำโค้ดด้านล่างนี้แทนที่ได้เลย - ประมาณ บรรทัดที่ 783)
// Set the empty for removal from route
// @todo remove code: $page = $page == 0 ? '' : $page;
$data->start->base = '0';
//$data->start->link = JRoute::_($params . '&' . $this->prefix . 'limitstart=0');

$data->start->link = JRoute::_($params . '&' . $this->prefix);

$data->previous->base = $page;

$data->previous->link = JRoute::_($params . '&' . $this->prefix . 'limitstart=' . $page);
if ($this->pagesCurrent == 2) {
$data->previous->link = JRoute::_($params . '&' . $this->prefix);
}

// Set the next and end data objects.