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


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


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

 

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

 

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

正文: 

1, 做 android 上的視頻編輯,一定要從編輯ffmpeg開始嗎? 

完全不是。需求是最重要的,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的費用遠遠小於您人力成本和時間成本的費用^_^。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM