2012-10-30

LINUX - ffmpeg 碰到的問題筆記


以下碰到的問題的是 base on ffmpeg version 1.0
ffmpeg version 1.0.git Copyright (c) 2000-2012 the FFmpeg developers
  built on Oct  4 2012 11:38:26 with gcc 4.3 (SUSE Linux)
  configuration: --prefix=/usr/local --libdir=/usr/local/lib64 --shlibdir=/usr/local/lib64 --enable-gpl --enable-shared --enable-libmp3lame --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libxvid --enable-libx264 --enable-libfaac --enable-postproc --enable-pthreads --disable-ffserver --disable-ffplay --enable-nonfree --enable-version3 --extra-ldflags=-ldl --enable-libvpx --disable-decoder=amrnb --enable-decoder=wmapro
  libavutil      51. 73.101 / 51. 73.101
  libavcodec     54. 63.100 / 54. 63.100
  libavformat    54. 29.105 / 54. 29.105
  libavdevice    54.  3.100 / 54.  3.100
  libavfilter     3. 19.102 /  3. 19.102
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 16.100 /  0. 16.100
  libpostproc    52.  1.100 / 52.  1.100

1. ffmpeg 轉 h264 的 mp4 無法用 flash player 播, 但抓下來 client 可以播
  • 解法 : 先轉成 flv, 再轉 mp4 即可; 量看起來很少, 算特例吧, 以後碰到手動做即可
  • cmd ex : 
# source encode to flv (sd)
ffmpeg -i source.avi -loglevel quiet -v 0 -s 240x360 -y -acodec libfaac -ab 128k -ar 44100 -crf 23 -threads 0 -r 10 -f flv sd-output.flv
# flv encode to mp4
ffmpeg -i sd-output.flv -f mp4 sd-output.mp4


2. ffmpeg 轉 m4a 完不能播
  • 解法 : 先轉成 mp3, 再轉成 mp4; 這情況有點複雜, 用下面的判斷式來描述比較清楚
if ((轉 mp3 成功) || (轉 mp3 有錯誤訊息, 但 mp3 檔有產生)) {
    # 先拿 source 轉 mp3, 再拿 mp3 轉成 mp4
} else if (轉 mp3 有錯誤訊息, 但 mp3 檔未產生) {
    # 直接用 source 轉 mp4
} else {
    # 目前還沒碰到
}
  • cmd ex : 
# 1.1 source encode to mp3
ffmpeg -i source.m4a -ss 00:00:00 -t 00:30:00 -loglevel quiet -v 0 -y -ab 128k -ar 44100 -ac 2 -vn -f mp3 output.mp3
# 1.2 mp3 encode to mp4
ffmpeg -i output.mp3 -ss 00:00:00 -t 00:30:00 -loglevel quiet -v 0 -y -ab 128k -ar 44100 -ac 2 -vn -f mp4 output.mp4
# 2. source encode to mp4
ffmpeg -i source.m4a -ss 00:00:00 -t 00:30:00 -loglevel quiet -v 0 -y -ab 128k -ar 44100 -ac 2 -vn -f mp4 output.mp4


3. ffmpeg 新版對 iphone 的自動旋轉問題 (前版不會有問題)
新版的 ffmpeg 轉完, flash 播比例會跑掉
原因在於 rotation 不是標準的 meta tag, 然後新版的轉完後,
rotation 值還在, 所以 flash player 就被影響了
  • 解法 : 加一個 -map_metadata -1 參數(會清掉 ffmpeg 不認識的 meta)
  • cmd ex :
ffmpeg -i i_SSndOE-5343270.mp4 -map_metadata -1 -c:v copy -c:a copy out.mp4
本來想只針對 rotation 這個 meta 去清, 
# Rotation 非標準 meta tag, 僅 iphone 用, 故 ffmpeg 不認識; ffmpeg 只能對標準的 meta tag 做內容的修改
ffmpeg -i i_SSndOE-5343270.mp4 -metadata Rotation="" -c:v copy -c:a copy out2.mp4
但轉出的 mp4 在 flash player 播一樣比例會跑掉, 因為 ffmpeg 只異能動標準的 metadata



承上, 寫幾個 cmd sample

3.1 現在改好沒問題的 cmd
ffmpeg -i source.mov -vf 'scale=1280:720,transpose=1' -map_metadata -1 -loglevel quiet -v 0 -ss 00:00:00 -t 00:30:00 -y -acodec libfaac -ab 128k -ar 44100 -vcodec libx264 -vpre medium -crf 23 -bufsize 6M -maxrate 6M -threads 0 -r 29.97 -f mp4 output.mp4
用 mediainfo parsing 的內容
mediainfo output.mp4
......
Width                                    : 720 pixels
Height                                   : 1 280 pixels
# 沒有 Rotation
......

3.2 因為升級 ffmpeg 版本而造成問題的 cmd
ffmpeg -i source.mov -vf transpose=1 -loglevel quiet -v 0 -s 1280x720 -ss 00:00:00 -t 00:30:00 -y -acodec libfaac -ab 128k -ar 44100 -vcodec libx264 -vpre medium -crf 23 -bufsize 6M -maxrate 6M -threads 0 -r 29.97 -f mp4 output.mp4
用 mediainfo parsing 的內容
mediainfo output.mp4
......
Width                                    : 1 280 pixels
Height                                   : 720 pixels
Rotation                                 : 90°
# Rotation 還在, 所以 flash player 播放有問題; 而且 widthxheight 比例也不對
......

3.3 前版的 ffmpeg 轉出來的影片, 用 mediainfo parsing 的內容
mediainfo output.mp4
......
Width                                    : 720 pixels
Height                                   : 1 280 pixels
# 沒有 Rotation
......

後記 : 實際上要補做這段時間進來的影片時, 用 copy 方式是無法修正的, 一定要用 source 重轉過 (因為 width, height 值的關係)
# 還是不能播, 因為 media 的 width&height 已經亂掉了
ffmpeg -i output.mp4 -map_metadata -1 -c:v copy -c:a copy output2.mp4 => 


沒有留言:

張貼留言