A. gstreamer 中那些gst-launch 命令怎麼轉換成c語言
gst-launch **
首先你要建一個pipeline,然後根據gst-launch後面的插件,建立相應的facotry就行了,類似這樣
source = gst_element_factory_make("filesrc", "filesrc");
return_val_if_fail(source,FALSE);
g_print("Good source Element\n");
GstElement *rtpmp2tdepay = gst_element_factory_make("rtpvp8depay",NULL);
if(!rtpmp2tdepay) {
g_print("rtpmp2tdepay == NULL\n");
}
最後到分流,建立相應的pad,最後設置state
B. ubuntu下用mplayer播放rm時的Not audio/video stream or unsupported錯誤
在新立得軟體管理器中搜索mplayer的相關的一切,然後標記已安裝的,徹底刪除,然後從新安裝mplayer應該能解決問題,估計是你修改了什麼設置造成的。最簡單的辦法就是重新下載安裝或者是直接到官網上編譯安裝就ok了,這個問題如果還再次出現的話,可以考慮一下解碼器的問題。當然如果用你搜到的辦法的話,我教你怎麼改:
先用上面的方法卸載掉mplayer,然後打開你從mplayer官網下的src包(源碼包,不是deb,也不是rpm,應該是tar.gz為後綴名的),找到libmpdemux這個文件夾下的demux_real.c這個文件,然後雙擊打開(默認應該是用gedit打開的),crtl+f調出搜索器,輸入「Not audio/video stream or unsupported」,然後在找到的地方從前面的「else {
mp_msg」到這段以「}」結尾的地方刪掉或者是在else前加個」#「(這就是注釋)然後源碼的修改就ok了。看了你的提問,估計你也不會編譯安裝,給你提供個解決的方法。
修改完源碼後,打開「終端」,
先添加編譯安裝的程序:sudo apt-get install libgtk2.0-dev
apt-get install build-essential
然後接著在裡面輸入sudo cd ,同時將你下載的源碼包拖入終端界面(或者是自己找到源碼包所在的文件夾位置這一切都是在你解壓縮後進行的),這時你就可以進行編譯了。
編譯的方法參見:http://hi..com/gaomingjm/blog/item/c11ac1634d5b06640c33fafc.html
這個問題貌似是老版本的mplayer的bug,你可以sudo apt-get update以後再install mplayer。
C. ubuntu下用mplayer播放rm時的Not audio/video stream or unsupported錯誤
在新立得軟體管理器中搜索mplayer的相關的一切,然後標記已安裝的,徹底刪除,然後從新安裝mplayer應該能解決問題,估計是你修改了什麼設置造成的。最簡單的辦法就是重新下載安裝或者是直接到官網上編譯安裝就ok了,這個問題如果還再次出現的話,可以考慮一下解碼器的問題。當然如果用你搜到的辦法的話,我教你怎麼改: 先用上面的方法卸載掉mplayer,然後打開你從mplayer官網下的src包(源碼包,不是deb,也不是rpm,應該是tar.gz為後綴名的),找到libmpdemux這個文件夾下的demux_real.c這個文件,然後雙擊打開(默認應該是用gedit打開的),crtl+f調出搜索器,輸入「Not audio/video stream or unsupported」,然後在找到的地方從前面的「else { mp_msg」到這段以「}」結尾的地方刪掉或者是在else前加個」#「(這就是注釋)然後源碼的修改就ok了。看了你的提問,估計你也不會編譯安裝,給你提供個解決的方法。 修改完源碼後,打開「終端」, 先添加編譯安裝的程序:sudo apt-get install libgtk2.0-dev apt-get install build-essential 然後接著在裡面輸入sudo cd ,同時將你下載的源碼包拖入終端界面(或者是自己找到源碼包所在的文件夾位置這一切都是在你解壓縮後進行的),這時你就可以進行編譯了。 編譯的方法參見: http://hi..com/gaomingjm/blog/item/c11ac1634d5b06640c33fafc.html 這個問題貌似是老版本的mplayer的bug,你可以sudo apt-get update以後再install mplayer。
D. gst_element_factory_make( "ffdemux_avi", "avi-demuxer" ); ubuntu中GStreamer編avi為什麼返回空
這要看你系統中裝的解碼器類型了,查看下有沒有在ubuntu上裝avi的解碼器。gst_element_factory_make會做兩步操作
gst_element_factory_find和gst_element_factory_create,建議你看下這個的源碼。
E. 什麼播放器能打開MP4文件
KMPlayer 2.9.1.1045 簡體中文漢化版(無捆綁垃圾軟體)
http://wise.togame.net:80/temp/HA-Kmplayer.exe
這是韓國高手寫的一個全能媒體播放器。和其它全能播放器一樣,只要您的系統內安裝有所需要的解碼器或者篩選器,這個播放器就可以播放那類文件。所不同的是,相對於其它大型播放軟體,她是那麼的小巧,但就是這個小小的播放器,她的功能之多,項目之全,目前可以稱得上是「天下無敵」,只要您能想到的功能她幾乎都有,甚至您想不到的功能她也有,例如我發現她的「音頻與視頻同步」和「聲道調整」功能是任何播放軟體都沒有的,而且這兩個功能是看各種電影必需的。該播放器用於看各類電影絕對是首選播放器!而且其支持幾乎所有外接篩選器和解碼器,甚至支持 Winamp 的一些插件,而且其外觀小巧而纖美,支持開發皮膚外觀,各種外衣使她猶如一位清純而不失華貴,待字閨中的小公主。原來我的系統內曾經安裝有 WMP 、Realplayer 及 hero 等播放器。自從有了她,我計算機就只安裝各類解碼器,其它播放器統統都「下崗」了。
KMPlayer The Professional Media Player!
它支持 Winamp 2/5 的輸入、常規、DSP、視覺效果、媒體庫插件。無須注冊表支持直接調用 Directshow 濾鏡!FFdshow 的視覺特效系統~超強的 GUI 界面~安裝電視卡後可以直接代替原軟體直接收看電視~支持播放 DVD/VCD 以及絕大多數電腦的媒體文件(AVI 支持 Xvid/DivX/3vid/H264 OGG/OGM/MKV 容器/AC3/DTS 解碼~Monkey Audio 解碼~)強烈推薦!此播放器除了會將自己的配置信息寫入注冊表外絕對綠色~
F. ubuntu下使用mplay時的Not audio/video stream or unsupported錯誤
這么說吧,你要找的demux_real.c這個文件在我下面提示的源碼包里,其實真實的文件位置是mplayer源碼包的/libmpdemux/這個路徑,demux_real.c這個文件就在裡面。你雙擊下載好的源碼包後,找到libmpdemux這個文件夾,然後進入裡面就可以找到demux_real.c了。這個問題的核心是你不懂得如何通過編譯源碼安裝軟體。只要搞定了如何編譯,你修改過的源碼安裝後你的問題就解決了。下面繼續說你上個提問沒說清的問題:
我前面說過讓你上mplayer官網上下載一個源碼包,地址是http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc2.tar.bz2
同時還必須下載相應的gui皮膚和解碼器:
解碼器:http://www.mplayerhq.hu/MPlayer/releases/codecs/all-20071007.tar.bz2
skin,我用的是New age:http://www.mplayerhq.hu/MPlayer/skins/new-age-1.0.tar.bz2
essential:http://www.mplayerhq.hu/MPlayer/releases/codecs/essential-20061022.tar.bz2
下載完以上文件後,我們需要安裝編譯需要的程序:libgtk2.0-dev和bulid-essential。
打開「終端」,
先添加編譯安裝的程序:sudo apt-get install libgtk2.0-dev
apt-get install build-essential
到此時,你的編譯環境就搭建好了。可以進入編譯程序的主題。
首先分別建立MPlayer主目錄,MPlayer Linux解碼器目錄和mplayer的win32解碼器目錄。
sudo mkdir /usr/local/mplayer
sudo mkdir /usr/lib/codes
sudo mkdir /usr/lib/win32codes
然後運行tar jxvf +源碼包存放的位置(可以右鍵屬性查看具體的路徑),解壓縮後源碼包應該就是在你的主文件夾裡面,找到以後按我最上面告訴你的方法找到文件後修改相應的文件,修改完成後記得一定要保存。
下面就是具體的編譯過程:sudo cd +解壓縮後的源碼文件夾(一般是/home/當前用戶名/源碼文件夾),然後輸入
./configure --enable-gui --datadir=/usr/share/mplayer \
--libdir=/usr/local/lib/codecs --language=en \
--with-reallibdir=/usr/local/lib/codecs/rp \
--with-win32libdir=/usr/local/lib/codecs/win32
--enable-gui:使MPlayer可以使用圖形界面
--datadir=/usr/share/mplayer:設置字體和skin所在目錄,取決於你剛才拷貝的目錄
--libdir=/usr/local/lib/codecs:設置解碼器所在目錄
--language=en:設置MPlayer的界面語言為英語,同樣可以設置為zh來顯示中文。(不過好像不管用)
--with-reallibdir=/usr/local/lib/codecs/rp:設置real文件解碼器目錄
-- with-win32libdir=/usr/local/lib/codecs/win32:設置win32解碼器目錄。
注意,win32解碼器不是必須的,但是設置這個目錄是有必要的,不然如果你設置了libdir,但是沒有設置win32目錄,MPlayer在運行時會提示錯誤信息(但是還能運行)。等configure結束了,下面就簡單了,直接make(這一步花費時間有點長,可以用-s參數來減少一些不必要的echo),然後make install(別忘了sudo)。這樣MPlayer就安裝到了系統中。 configure過程中如果提示有相應的包沒有存在的話,可以進入新立得軟體包中搜索相應的包然後安裝。
最後,我們要把下載好的皮膚用sudo -r 命令將皮膚文件拷貝到/usr/share/mplayer/skins
解碼器拷貝到/usr/local/lib/codecs
(解碼器需要用上面相同的方法解壓縮以後再),如果播放文件提示缺少解碼器的話,可以用sudo apt-get install gstreamer0.10-tools gstreamer0.10-x gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg gstreamer0.10-alsa gstreamer0.10-schroedinger gstreamer0.10-pulseaudio 安裝gstreamer解碼器(這種情況不大可能出現)。
mplayer rc2版本還有一個播放rmvb文件時提示出錯的問題,解決的辦法是在官方網站上下載http: //www1.mplayerhq.hu/MPlayer/releases/codecs/essential-20061022.tar.bz2在前 面的拷貝解碼器那一步把其中的幾個文件拷到解碼器目錄
完成所有的步驟以後你可以在終端或者「開始」-「影音程序」—「Mplayer」運行mplayer或者gmplayer命令。其中gmplayer是啟動帶圖形操作界面的mplayer,當然了你必須在configure時啟用了enable-gui選項並且你的skin安裝正確了。
G. FFmpeg調研報告
FFmpeg 是非常強大的多媒體編解碼框架,堪稱多媒體處理的瑞士軍刀,是集錄制,轉碼,流的完整的跨平台多媒體解決方案。本身涵蓋了大量的多媒體處理工具。
而我們常說的視頻,其實是包含的視頻,音頻甚至還有字幕的一個整體。因為視頻本身是三維的數據,在計算中直接存儲空間非常大,通常無法接受,所以,會對其進行一些編碼和壓縮,這個過程通常是有損的,但卻極大了降低了它的存儲空間。
視頻數據相比點陣圖數據多了一維,但其本身還是由像素點組成。
編碼、壓縮在流媒體領域是一項非常重要的技術:從 H264碼流 到 YUV流 的過程稱為 解碼 ,反之稱為 編碼 。
幀是流的基本元素,即視頻流中的圖像。在原始流里,各幀都一樣。但經過編碼壓縮後的幀,通常分為下面幾種:
注意:I、P、B幀,並不是依據視頻幀數據內部的元素的不同來區分的,從解碼後的幀本身而言,它們沒有任何區別。僅僅是在編碼時,對幀處理的方式不同而已。
首先視頻文件與視頻編碼格式是兩個概念。
一般包括以下部分:
FFmpeg 處理視頻轉碼時的常規過程如下:
各自狀態的數據產物如下:
視頻中會有音頻,視頻,它們在文件有各自的編碼壓縮方式,但為了傳輸過程方便,將壓縮過的音頻和視頻捆綁在一起進行傳輸。首先就需要將媒體文件中的各個音頻,視頻,字幕流等分開。
這一步叫Demux(解復用)。總結就是把不同的流從某種容器(文件)中解析出來。如上圖所示,並且,一個媒體文件中,還可以分別有不止一個音頻,視頻和字幕流。
媒體數據為了降低存儲量,針對裡面的音頻,視頻,字幕等都會採取特定方式的編碼壓縮。
這一步便對各自的流採用其對應的解碼演算法進行處理。得到原始流。
即這一步是以幀為單位實現壓縮數據到原始數據轉換。
這一步再按照目標的編碼方式對流進行編碼。即這一步是以幀為單位實現原始數據到壓縮數據轉換。
Demux的逆操作,把不同的流按照某種容器的規則放入容器
按照編解碼器的位置劃分:
FFmpeg中filter分為:
因其僅有解碼部分的硬體加速,缺少編碼部分的加速。且Nvidia有單身以NVENC和NVDEC替代掉這一塊的意思,這里不多做細節介紹。細節請看 文檔
支持的格式有:
優點:
各種型號的設計支持情況請看 Video Encode and Decode GPU Support Matrix
查看硬體支持:
使用CUDA解碼:
使用CUVID解碼:
轉碼,使用NVDEC和NVENC
可以使用 -hwaccel_device <id> 指定GPU。GPU id可以通過 nvidia-smi 查看
該方案一般通過QSV來進行加速。QSV(Quick Sync Video)即Intel的集成加速器,該方便優缺點如下:
優點:
查看CPU是否支持的方法如下:
該方案支持h264,h265,mjpeg,mpeg2video,vp8,vp9的編解碼,和vc1的解碼。
更細節的支持情況如下:
解碼支持情況:
編碼支持情況:
QuickSync對於編碼解碼在CPU使用率上都有著非常不錯的提升。編碼提升效果特別明顯。
關於抽幀的各種表現,待之後測試補上。TODO
更多細節可以參考官方 文檔
FFmpeg使用QSV加速的一些命令行參數可 參考
使用ffprobe提取出IPB幀的時間
抽取IPB幀到jpg圖片:
抽幀流程其實與轉碼類似,一樣是輸入視頻文件,對視頻文件進行Demux,解碼視頻流,得到原始視頻幀,然後挑選相應的視頻幀按jpeg編碼,mux輸出到一個個文件中。
那麼要加快抽幀的效率,便是想辦法加快上面這各個階段的速率
抽幀會伴隨著大量的文件輸出。在有很多抽幀任務並行時,理論上會對磁碟造成大量的隨機寫入。
其他途徑優化:
結合以上各節點,這里列出一些進一步的調研方向:
此方案針對加快解碼,加快編碼。基於目前的信息來看:
該方案會有非常大的優化效果,若有足夠支持QSV的CPU機器,那麼該方案可行性非常大。
待進一步補充相關測試數據
同上,針對解碼編碼方面嘗試加快進行優化。目前情況:
該方案理論上也應該會有不錯的優化效果。但就目前的一些簡單測試來看,即使能達到好的加速效果,其成本也未必能夠接受
待進一步補充相關測試數據
該方案針對加快數據讀取和數據輸出。考慮的點主要是整個抽幀過程中是否對視頻文件有不小量的隨機讀取,大量抽幀任務並行時,會有巨量的圖片輸出。這塊是否會產生大量的隨機寫入,降低效率。
待進一步補充相關測試數據
該方案針對加解碼(更確切地說是減少不必要的解碼操作)
例如對於一秒一幀的均勻抽幀,我們針對這種情況,修改為,盡量抽取每一秒中的關鍵幀。做個偽的一秒一幀的均勻抽幀。這種模式不一定能為所有抽幀情況加速,但若能為大頭的需求加速也不錯
待進一步測試驗證可行性及補充相關測試數據
針對解碼編碼方面嘗試加快進行優化。
ffmpeg中,同樣格式可能有多個編碼解碼器,比如jpeg的就會有mjpeg,libjpeg等。不同的庫實現,性能,質量會有一些差距,通過測試實驗,改善參數,或許一定程度上能優化性能。
待進一步補充相關測試數據
針對流程的優化。如前面的單幀抽幀, -ss 參數的不同位置會影響 ffmpeg 抽取的時間。理論上,ffmpeg 本身設計是為了通用,而對於專用於抽幀的場景,ffmpeg本身可能存在一些沒必要的工作,嘗試通過參數和源碼級別來優化,或許能省掉這部分的資源消耗。
待進一步補充相關測試數據
TODO
FFmpeg官網
3GP/MP4 視頻文件格式解析及其播放原理(轉)
FFmpeg視頻抽幀那些事
FFmpeg原理和架構
FFmpeg 硬體加速方案概覽 (上)
FFmpeg 硬體加速方案概覽 (下)
FFmpeg wiki HWAccelIntro
視頻和視頻幀:FFMPEG+Intel QSV硬解的環境安裝篇
視頻和視頻幀:視頻和幀基礎知識整理