android平臺短視頻技術之 視頻編輯的經驗分享.

android平臺短視頻技術之 視頻編輯的經驗分享.


java

提示一: 各位看官,這裏分享的是視頻編輯,即剪切/拼接/分離/合併/塗鴉/標記/疊加/濾鏡等對視頻的編輯操做.不是流媒體網絡播放等功能,請注意.linux

 

提示二: 這些文字90%的爲普及知識,10%爲宣傳咱們的SDK,由於分享別人,有利自已,纔是良性循環,纔可讓咱們持續分享,畢竟只分享,不有益很難持續下去.要養家餬口啊^_^.android

 

提示三:咱們是android視頻編輯的專業團隊,如下分享的文字,徹底實際經驗總結,每個知識點您均可以在咱們的SDK或開源的工程中驗證.
咱們的SDK:https://github.com/LanSoSdk/LanSoEditor_common(收費的,但寫了30個詳細註釋,適合初學者學習,能夠用來練手)
開源的工程:https://github.com/WritingMinds/ffmpeg-android(免費的,須要本身編譯,需懂linux和ndk)
這兩個工程您均可以測試,學習後, 而後再決定採用何種方式對您的項目最有利。

正文: git

1, 作 android 上的視頻編輯,必定要從編輯ffmpeg開始嗎? github

徹底不是。需求是最重要的,android從4.1開始提供了MediaCodec類,你要作視頻提取圖片,用mediacodec或mediaextractor就能夠;你作視頻裁剪,用MediaCodec也能夠;你要作視頻縮放,用MediaCodec+ Opengl是最好的選擇;徹底不必定用ffmepg來作。編程

2,那麼爲何不少用ffmpeg來完成?
由於ffmpeg封裝了不少的格式,使用起來比較靈活,簡單,兼容性好,他的命令行能夠幫你節省大量的時間,好比視頻裁剪 ffmpeg -ss 10 -t 20 -i INPUT -acodec copy -vcodec copy OUTPUT;這樣就完成了,再也不須要您本身去編寫大量的代碼。
3,ffmpeg能夠幫我完成大部分的視頻編輯功能嗎?
沒有優化的ffmpeg在功能能夠,但性能不行。因爲手機CPU的性能的限制,有些命令處理起來比較慢,好比overlay命令,colorchannelmixer命令 eq命令,libx264編碼功能,這樣你功能上雖然實現了,但處理一個10秒的視頻,要花費2分鐘,這樣的功能,估計很難在APP裏使用。咱們的SDK針對這樣的狀況,作了硬解碼器和硬編碼器,徹底加速ffmpeg的執行,這個也是咱們SDK的核心所在。
4,ffmpeg我怎麼開始作呢?
    若是您是初學者,建議不要一上來就編譯ffmpeg,由於網上github上編譯好的工程太多了,你的目的是學習使用到你項目中。再說了,若是你要用ffmpeg實現一些複雜的運算,即便你花費一週時間編譯好了,結果發現功能能夠知足,但處理起來太慢了,根本沒法使用,事倍功半,也是沒意義的。建議用上面推薦的兩個連接,先學習了再說,即便收費的版本,但ffmpeg的命令代碼是公開的,運行是不變的,只是有時間和其餘限制而已,學習ffmepg是沒有阻礙的。建議先學習起來再說,畢竟熟悉了,才能夠靈活的使用。
5,ffmpeg哪些功能執行較快,而且免費工程裏也能夠實現?
         像普通的音視頻剪切,分離,合成,拼接,封裝,格式轉換這些是能夠的。由於沒有用到視頻數據解碼和編碼操做,執行起來很快;好比秒拍中音樂那個功能,他用到的命令有: 音頻裁剪,把視頻中的音頻分離,而後把新的音頻在和視頻合併;用到音量調節,也能夠用ffmpeg的amixer來實現;再好比秒拍中的視頻截取,其實就是用ffmpeg的截取命令來實現的;再好比你直接把MediaCodec編碼好的H264裸碼流保存成文件,你想封裝成mp4格式,讓別的播放器也能夠播放,則用ffmpeg的封裝命令就能夠實現,不須要本身去封裝。若是您的項目中只用到這些,則免費版本就能夠知足,徹底不須要收費的SDK。
6,普通的ffmpeg哪些功能較慢,不適合使用?
         在一些須要用到操做視頻畫面像素的場合,好比用overlay作疊加,colorchannelmixer或eq作濾鏡,用scale縮放,用到視頻解碼-->處理-->再編碼的場合。
         這些功能的大概工做流程是:
         第一步解碼,若是採用硬件解碼,則會快不少,若是用軟解碼,即便通過NEON批處理優化,處理速度仍是不夠理想;
         第二步處理,假如您用到的是colorchannelmixer這個命令,他的工做原理是事先把255個像素值根據您的設置所有放到一個表裏,在處理一個像素時,利用查表法來獲得處理後的值,雖然快一些,但和用opengl比較起來仍是很慢,畢竟這個是一個像素一個像素的去作,而opengl則採用矢量並行處理,速度上徹底不能比;
         第三步:視頻編碼,ffmpeg自己不帶H264視頻編碼器,須要使用外部的,好比libx264,libopenh264這些,但也是軟編碼。
         你的視頻每幀都須要通過這三步來作,解碼,處理,再編碼。這樣下來,假如20秒的視頻,每秒25幀,則是500幀,若是不用硬件加速來作,速度上估計很難完成。
         咱們的SDK針對這樣的狀況,作了硬解碼和硬編碼,加速ffmpeg的執行,讓它跑快一些,這個也是咱們SDK的核心所在。
 7,有沒有好的辦法,又想實現功能,又想用免費版本的?
      有。 用MediaCodec+ OpenGL的形式來作,把ffmpeg一些處理慢的操做,通通用MediaCodec+OpenGL來實現,好比濾鏡,好比疊加,好比縮放等,咱們高級版本中的大部分操做也是用opengl來作的,咱們作了大量的工做,讓你像操做一個ArrayList類同樣,增長一個媒體,刪除一個媒體,簡單易用。
      
 8,若是咱們本身作,須要懂得哪些知識:
     首先你要從戰略上輕視它^_^,畢竟又不是讓你去搞科研,去搞高精尖,去得到諾貝爾獎。這是一項技術,一項已經很成熟的技術,相似學習android的UI,學習java的編程同樣的一項技術,須要的是在這方面知識的積累和花時間去作的事情。若是你是初學者,那須要花很長的時間去學習,去摸索的事情,而後精通的過程。
     再者你就要從戰術上重視它^_^, 涉及到的知識點有:
      8.1 linux基本操做,在這裏強烈不推薦在windows下用cygwin來搞,第一很難行通,第二事倍功半。
      8.2 ndk和jni,gcc的知識,由於你要作的最終要封裝成java的一個類和方法,讓作UI的工程師調用,並須要懂得一些java的編程,這樣你調試起來會快一些。
      8.3 視頻的知識。這個必不可少,也不用多說,畢竟作的是視頻編輯,像視頻格式,音頻,pcm,h264的基本知識,視頻碼率,分辨率,幀率,ffmpeg的經常使用命令等等。
      8.4 懂得視頻知識後,強烈推薦徹底精通MediaCodec和視頻播放原理,由於這個能夠幫你節省大量的時間去實現一個功能。

總結:不要一上來就編譯,學以至用才重要,用免費的版本消耗的是人力成本和時間成本,用咱們的SDK能夠加速您項目的開發,再說咱們的SDK的費用遠遠小於您人力成本和時間成本的費用^_^。windows

相關文章
相關標籤/搜索