FFMPEG转码常用命令研究
ffmpeg簡介
官網(wǎng)鏈接是http://www.ffmpeg.org/上有說明,它是音視頻的分離,轉(zhuǎn)換,解碼的完全解決方案。?
其中最重要的就是libavcodec庫。它被mplayer或者xine使用作為解碼器。還有,國內(nèi)比較流行的播放器影音風(fēng)暴或MyMPC的后端ffdshow也是使用ffmpeg的解碼庫的。
ffmpeg包括一組軟件,ffmpeg用于對媒體文件進行處理,ffserver是一個http的流媒體服務(wù)器,ffplay是一個基于SDL的簡單播放器。兩個庫文件libavcodec和libavformat。
ffmpeg作為媒體文件處理軟件,基本用法如下:?
ffmpeg [global_options] {[input_file_options] -i ‘input_file’} ... {[output_file_options] ‘output_file’} ...
輸入輸出文件通常就是待處理的多媒體文件了。可以是純粹的音頻文件,純粹的視頻文件,或者混合的。?
大部分常見的格式都能夠“通殺”。象常見的各種mpeg,AVI封裝的DIVX和Xvid等等
對ffmpeg命令選項的了解,先從下面的命令開始
ffmpeg -h
ffmpeg -h long
ffmpeg -h full
man ffmpeg需要安裝ffmpeg的手冊頁條目
各選項參數(shù)的解釋,詳情參見
http://www.ffmpeg.org/ffmpeg.html
列出幾個主要的選項?
-vcodec 視頻流編碼方式?
-b 視頻流碼率(默認只有200k,一般都需要手動設(shè)置,具體的數(shù)值視codec選擇而定)?
-r 視頻流幀數(shù)(一般說來PAL制式通常用25,NTSC制式通常用29)?
-s 視頻解析度(分辨率,也要視codec和你的需要而定。通常改變某個視頻流的解析度是很耗費CPU的事情。另:具體寫法使用“數(shù)字x數(shù)字”的形式。中間是小寫字母“x”,這個用過mplayer的應(yīng)該都知道)?
-t 處理持續(xù)時間。?
-acodec 音頻流編碼方式?
-ab 音頻流碼率(默認是同源文件碼率,也需要視codec而定)?
-ar 音頻流采樣率(大多數(shù)情況下使用44100和48000,分別對應(yīng)PAL制式和NTSC制式,根據(jù)需要選擇)
還有些可能需要用到的選項如?
-vn和-an分別是屏蔽視頻流和屏蔽音頻流,分別對源文件處理一次即可得到分離的音頻和視頻?
-author -title分別是設(shè)置媒體文件的作者和title?
-f選項是強制使用某種格式?
-target type是使用預(yù)置的格式轉(zhuǎn)換(可以轉(zhuǎn)成dvd,vcd或svcd)
除此之外還有些更高級的選項,如設(shè)定vbr,或設(shè)定high quality,或者設(shè)定vbr的buff和max/min碼率,象一般我們自用的dvd抓軌啦,DV轉(zhuǎn)vcd或dvd啦,網(wǎng)上下載的電影轉(zhuǎn)成vcd或dvd都不一定需要用到它們。?
具體的使用方法在man里面有介紹。簡單明了。
-bsf比特流過濾器設(shè)置
首先使用ffmpeg -bsfs來查看所有的比特流過濾器,使用下面的命令
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
來匹配要復(fù)制的視頻流,也是就是說,是有條件復(fù)制視頻流,必須匹配上才復(fù)制
-c選項是-codec的縮寫
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
意思是encodes all video streams with libx264 and copies all audio streams.
-map選項解讀
指定一個或多個輸入流作為輸出文件的源。每個輸入流由input_file_id[:stream_specifier]表示,這兩個索引都從0開始計數(shù),-stream_specifier
表示一個負map,參見下面的例子
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
選擇a.mov中的第三個流,和b.mov中的第7個流,把它們復(fù)制到輸出文件中
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
選擇所有的視頻流和第3個音頻流,把它們復(fù)制到輸出文件中
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
除了第2個音頻流以外,復(fù)制其他的流到輸出文件中
ffmpeg -i INPUT -map 0 output
復(fù)制第一個文件中的所有流到輸出文件中
關(guān)于ffmpeg hls更詳細的官方文檔,參見
http://www.ffmpeg.org/ffmpeg-all.html
在頁面中搜索“hls”即可
下面是該官方網(wǎng)頁給出的一個例子
Segment the input file, and create an M3U8 live playlist (can be used as live HLS source):
?
ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
-segment_list_flags +live -segment_time 10 out%03d.mkv
下面是我收集的hls版本,并不好用。
ffmpeg -i inputfile.avi -c:v libx264 -c:a libvo_aacenc -hls_time 10 -hls_list_size 0 outputfile.m3u8
ffmpeg -i inputfile.avi -c copy -bsf:v h264_mp4toannexb -map 0 -hls_time 10 -hls_list_size 0 outputfile.m3u8
注意:我測試后,發(fā)現(xiàn)hls版本的命令生成的ts片段非常差,幾乎不能觀看。
目前的ffmpeg版本是支持hls的,直接使用下面的命令也會同時生成ts片段和m3u8文件,每個ts片段是默認2s,這反過來也說明ffmpeg是支持hls的
ffmpeg -i in.nut out.m3u8
對于hls切片來說,下面的命令使我測試過很好用的,特收藏如下
ffmpeg -i 1.mp4 -f segment -segment_time 10 -segment_format mpegts -segment_list list_file.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 output_file-%d.ts
這條命令的限制是:要求生成ts分片的輸入視頻是視頻是h.264編碼,音頻是aac編碼的視頻文件,從優(yōu)酷網(wǎng)上下載的視頻片段都是符合這個條件的。
獲取ffmpeg最新源碼方法
git clone git://source.ffmpeg.org/ffmpeg ?ffmpeg
更新本地源碼
git pull (--rebase)
git的使用方法詳見
http://www.ffmpeg.org/git-howto.html
總結(jié)
以上是生活随笔為你收集整理的FFMPEG转码常用命令研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Nginx-rtmp-module搭
- 下一篇: HLS中m3u8格式规范解读