2012/01/20

多媒體檔案處理 ffmpeg, netpbm...

用 ffmpeg 來處理影片及照片是非常理想的。會寫這個議題,主要是因為我想節省上傳到 blog 的時間。若仔細一點會發現,當我們把檔案上傳到 Picasa 或 blogger 時,所占用的空間比原始檔案小很多很多!其實是因為 google 有在伺服器端處理過。

上述現象我多年前一開始用 Picasa 就知道了,後來發現上傳到 blogger 的照片也會自動放到 Picasa。不過一向都很懶,最近閒閒的,就寫了幾個 script 用來處理影片及照片,這樣也可以節省上傳的時間。這一點不比較不知道,我們自己先處理過後,上傳節省的時間可真的是非常驚人啊!如果.........嘿嘿..........如果什麼我就不多說了,總之勤勞一點會讓自己省很多時間,而時間就是金錢啊!

上面連結是我整理的文件,裡面就有 script....系統當然要安裝 ffmpeg 及 netpbm 而且我在用的環境可不是 windows, 而是 ubuntu, 這一點對 windows 的朋友們只能說聲抱歉了!但是好消息是,這兩套軟體其實都有 windows 版的 ffmpegnetpbm , 請自行上網直取最新版,用法當然都一樣,只是請自行寫 windows 下的 .bat 檔來用吧。

上面的網址有人反應不通,可以再試一次,或是直接 copy 底下的內容,不過我懶得貼 USAGE, 每個指令的 USAGE 都不一樣,請自行編輯自己的 USAGE:

  • video2avi
    把影片轉成 avi 格式,而且大小是 320x240, 這是因為我要上傳到 blog 解析度剛好
    [ "$#" = "2" ] || usage
    ffmpeg -i $1 -vcodec mpeg4 -s 320x240 -b 300k -r 30 -acodec copy -ar 22050 -ab 64k -f avi $2
    
  • video2img
    把影片存成每秒 n 張的圖片
    [ "$#" = "3" ] || usage
    ffmpeg -i $1 -r $2 -f image2 $3
    
    範例: video2img MOV00001.mpg 10 micro-video-%03d
  • video-from-img
    [ "$#" = "3" ] || usage
    ffmpeg -i $1 -r $2 -f image2 -c:v libx264 -r 30 $3
    範例: video-from-img img%03d.png 1/5 out.mp4
      如果照片沒照順序,需要用以下的命令,請自行參考
    ffmpeg -i '*.png' -r 1 -f image2 -pattern_type glob -c:v libx264 out.mp4
  • video2mp3
    將影片中的音軌取出存成 mp3
    [ "$#" = "2" ] || usage
    ffmpeg -i $1 -vn -acodec libmp3lame -ab 192k $2
    
  • video2vcddvd
    將影片轉成 vcd 或是 dvd,可以分開成兩個指令較方便
    [ "$#" = "3" ] || usage
    [ "$2" = "vcd" ] && ffmpeg -i $1 -target ntsc-vcd $3
    [ "$2" = "dvd" ] && ffmpeg -i $1 -target ntsc-dvd $3
    
  • video_cut
    [ "$#" = "4" ] || usage
    ffmpeg -i $1 -ss $2 -t $3 -f image2 $4
    
    還有一種語法如下,只截一張:
    ffmpeg -i $1 -y -f  image2  -ss $2 -vframes 1  $3
    -ss 的時間單位也可以是秒,如下:
    ffmpeg -i $1 -y -f  image2  -ss $2 -vframes 1  $3
    
  • video_histogram
    如果影片偏暗或是偏亮,可以用這個方法將亮度調「平均」,因為是計算的,絕對無法真的平均,所以除非你不喜歡影片亮度再試。
    [ "$#" = "2" ] || usage
    rm -rf /tmp/my-video; mkdir -p /tmp/my-video/{orig,hhh}
    ffmpeg -i $1 -r 30 -f image2 /tmp/my-video/orig/%05d.pnm
    pushd /tmp/my-video/orig
    for i in `\ls`; do
      FILE=`echo $i| cut -d. -f1`;
      pnmhisteq $i > ../hhh/${FILE}.pnm;
    done
    popd
    ffmpeg -i /tmp/my-video/hhh/%05d.pnm -r 30 $2
    
  • img_resize - 用 ffmpeg
    將相片縮小成 1600x1200, 這是 blog 預設的圖片大小,而通常相機也都遠大於這解析度。另外大家可能不知道,相機為了盡可能保持影片資訊,雖然是有壓縮的,但是其實是調成盡可能保存影片資訊,只要調整一下壓縮比例至 99% 或是 90% 就大大降低檔案大小。總之一句話,經過這樣轉換後,照片大小縮小很多很多。
    底下指令因為太簡單,我並沒有寫成 script, 只是寫個範例
    ffmpeg -i $1  -s 1600x1200 a.jpg
  • img_resize 2 - 用 netpbm
    用 ffmpeg 處理照片有時會遇到無法讀取的問題,也就是有些相機的格式不被讀取, 譬如我就遇到如下的錯誤訊息:
    [mjpeg @ 0x139bcc0]error count: 71
    [mjpeg @ 0x139bcc0]error y=23 x=156
    Input #0, image2, from '20120206_133247.jpg':
      Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
        Stream #0.0: Video: mjpeg, yuvj422p, 3264x2448, 25 tbr, 25 tbn, 25 tbc
    

    因此只好改用 netpbm 來轉換,轉換命令如下列範例:
    jpegtopnm 20120206_133247.jpg | pnmscale -xsize=1600 -ysize=1200 | pnmtojpeg - > aaa.jpeg
    
  • 將影片變成快動作/慢動作
    這功能要由 mencoder 來實作,底下也只是範例,可以自行改成 script。mencoder 功能一樣很強大,算是編輯影片必備,例如將照片合成時加上配樂。
    mencoder -ovc copy -nosound -speed 5 in.mpg -o fast.mpg
  • 切割音軌
    用另一個軟體做的範例,ffmpeg 也可以做到
    cdparanoia -B  : 整張 CD
    cdparanoida -B 3-7 : 只抓 3,4,5,6,7 音軌
    cdparanoia "2[:35.00]-2[2:30.00]" : 抓第二軌
    

0 意見: