Ffmpeg 101


#1

Convert movie to GIF

หลักๆ ก็แค่ output ออกเป็น gif

-vf scale=700:-1:sws_dither=ed -r 10 -y myvideox.gif

จะมี input เป็นอะไรก็ใส่ๆไป เช่น

ffmpeg -i video.mpg -vf scale=700:-1:sws_dither=ed -r 15 -y myvideox.gif

Here are quite great info of how to deal with GIF quality
http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html

Cut video

สิ่งที่ต้องรู้ คือ เริ่มตรงไหน และต้องการช่วงเวลาเท่าไหร่

-i input.mp4 -ss 00:03:15 -t 00:01:00 -c copy output.mp4

มันคือ เริ่มเวลา 3:15 video นี้จะยาว 1 นาที โดยมี codec เดิมๆ

Concat, join, merge

The simplest way:

ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -c copy merge.avi

But this would cause Found duplicated MOOV Atom. Skipped it error if it’s from the same clip originally. Concat demuxer is the way to go.

  1. Create list.txt

    file 'out1.mp4'
    file 'out2.mp4'
    file 'out3.mp4'
    
  2. Then concat by

    ffmpeg -f concat -safe 0 -i merge.txt -c copy merge.mp4
    

crop

Use the crop filter:

ffmpeg -i in.mp4 -filter:v "crop=output_w:out_h:x:y" -c:a copy out.mp4

Where the options are as follows:

  • output_w is the width of the output rectangle
  • output_h is the height of the output rectangle
  • x and y specify the top left corner of the output rectangle
  • -c:a copy to avoid re-encoding

more info: about cropping https://video.stackexchange.com/questions/4563/how-can-i-crop-a-video-with-ffmpeg

resize

นี่คือ resize ไป 1080 งี้ อยากจะเปลี่ยนเป็นยังไงก็เปลี่ยนตรง scale เอา

ffmpeg -i source.mp4 -vf scale=-1:1080 -c:v libx264 -crf 18 -preset veryslow -c:a copy output_1080p.mp4

rotate

มี 2 แบบ

  1. กลับมันจริงๆ
  2. กลับรูป ด้วยการเปลี่ยนค่าใน metadata --> อันนี้น่าจะเป็นทางที่ดีกว่า

> กลับมันจริงๆ

time ffmpeg -i source.mp4 -vf "transpose=2,transpose=2" output.mp4

ปัญหาคือ quality มันจะเปลี่ยนไปด้วย แม้ว่าจะบังคับ -c:a copy ก็ตาม ไม่รุ้ทำไมเหมือนกัน bitrate ลดลงเห็นๆ นั่นคือ file ก็เล็กลง แม้จะเหมือนว่า คุณภาพไม่ต่างอะไรเท่าไหร่ แต่ก็บังคับให้มันเหมือนเดิมไม่ได้ (ทำไม่เป็น 55)

> กลับมันด้วยการเปลี่ยน metadata

ffmpeg -i source.mp4 -metadata:s:v rotate="180" -codec copy output.mp4

ตรงค่า -metadata:s:v rotate="180" ถ้าเป็น 90 ก็หมุน 90 degree นั่นแหละ 180 มันก็กลายเป็นกลับหัวงี้

juxtapose videos

มี video ขนาดเดียวกัน 2 file เอามาแบ่งคนละครึ่งใน videos เดียวกัน

ffmpeg \
  -i input1.mp4 \
  -i input2.mp4 \
  -filter_complex '[0:v]pad=iw*2:ih[int];[int][1:v]overlay=W/2:0[vid]' \
  -map [vid] \
  -c:v libx264 \
  -crf 23 \
  -preset veryfast \
  output.mp4

This essentially doubles the size of input1.mp4 by padding the right side with black the same size as the original video, and then places input2.mp4 over the top of that black area with the overlay filter.

source: stackexchange

Audio

cut

มันประหลาดตรงที่ใช้วิ เต็มๆ แทนที่จะใช้ format 00:00:00 งงไป

ffmpeg -i in.wav -ss <s ที่เริ่ม> -t <ระยะเวลา (s)> -c: (copy, mp3, aac, wav) out.wav

no audio

ffmpeg -i input.webm -c h264 -an output.mp4