轉載給ffmpeg入門級:我的第一個調用FFmpeg庫的程序出爐

好消息,寫了第一個使用了ffmpeg的庫的小程序。
看起來就是這么簡單的一個消息,但是you have no idea how much work that I did before it works...
?
廢話少說,總結記錄之。。。
一、安裝好Linux的虛擬機。
? ? 我用的是FEDORA-16,當然別的也許能行,不過沒親測。什么叫安裝好,大概定義一下:1、安裝能進入系統,安裝的時候用FEDORA-DVD.ISO比較好,不推薦用LIVE-CD。因為DVD可以自帶更多的軟件,并且在安裝的時候可以選擇“軟件開發”這個選項,這樣的話,就會默認安裝好很多軟件以及其依賴的庫,那樣之后的工作會簡單很多。
? ? 待虛擬機安裝好之后,
二、更新系統軟件
? ? 執行“sudo yum update”,可使得很多軟件更新完畢,當然,耗時有點長,取決于機器性能和網絡環境。
三、安裝git,并且拉取最新ffmpeg源代碼
? ? 因為ffmpeg是用git來維護整個項目的,所以我們必須安裝好git,然后用git去拉去最新的源代碼。
? ? 執行“sudo yum install git”,來安裝git。
? ? 執行“git clone git://source.ffmpeg.org/ffmpeg.git”,完畢后會發現當前目錄下會有一個ffmpeg目錄,這就是最新的源代碼了。
四、編譯ffmpeg
? ? 進入ffmpeg文件夾,三部曲,”./configure“,”make“,”sudo make install“。
? ? 在執行./configure的時候,可能會提示沒有安裝yasm,那么執行”sudo yum install yasm“即可。
? ? 在執行make,就是編譯整個ffmpeg項目了,會生成一些二進制文件,例如:ffplay、ffserver、ffmpeg、ffprobe。
? ? 在執行sudo make install時候,會把編譯生成的.a歸檔復制到/usr/local/lib下,下面看結果
[michael@localhost?/]$ ll /usr/local/lib
total 69676
-rw-r--r--. 1 root root 51473968 May ?9 16:48 libavcodec.a
-rw-r--r--. 1 root root ? 582964 May ?9 16:48 libavdevice.a
-rw-r--r--. 1 root root ?1855462 May ?9 16:48 libavfilter.a
-rw-r--r--. 1 root root 15274554 May ?9 16:48 libavformat.a
-rw-r--r--. 1 root root ? 219562 May ?9 16:48 libavresample.a
-rw-r--r--. 1 root root ? 576360 May ?9 16:48 libavutil.a
-rw-r--r--. 1 root root ? 189182 May ?9 16:48 libswresample.a
-rw-r--r--. 1 root root ?1157418 May ?9 16:48 libswscale.a
drwxr-xr-x. 2 root root ? ? 4096 May ?9 16:48 pkgconfig
[michael@localhost?/]$?
? ?還會把ffmpeg的一些.h的頭文件復制到/usr/local/include下,看結果:
[michael@localhost?/]$ ll /usr/local/include/
total 32
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libavcodec
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libavdevice
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libavfilter
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libavformat
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libavresample
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libavutil
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libswresample
drwxr-xr-x. 2 root root 4096 May ?9 16:48 libswscale
[michael@localhost?/]$?
? ? 注意,你可以看到上面這幾個都是目錄,不然進入libavformat看看,看結果:
[michael@localhost?/]$ ll /usr/local/include/libavformat/
total 92
-rw-r--r--. 1 root root 71469 May ?9 16:48 avformat.h
-rw-r--r--. 1 root root 16168 May ?9 16:48 avio.h
-rw-r--r--. 1 root root ?2858 May ?9 16:48 version.h
[michael@localhost?/]$?
? ? 可見真正的頭文件都在對應名字的目錄內,那么我們在程序中引用頭文件的時候,應該這樣寫”#include libavformat/avformat.h“,而不是這樣寫”#include avformat.h“,為什么呢?因為你不指定路徑的情況下,gcc會去/usr/local;/usr下找avformat.h,當然找不到(因為avformat.h在/usr/local/libavformat目錄下,而不是在/usr/local下)。所以往往有人編譯的時候報錯,找不到頭文件,就是這個原因。五、寫一個調用了ffmpeg庫的小程序 ? ?既然ffmpeg安裝完畢,那么就自己編一個小程序,在程序里面調用ffmpeg的API吧。
? ? 源代碼如下所示:(應該是非常簡短的了)
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libavutil/avutil.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
? ? ? ? printf("going to av_register_all\n");
? ? ? ? av_register_all();
? ? ? ? return 0;
}

? ? 編譯命令如下所示:
gcc -o test ./shortest.c -lavformat -lavcodec -lavutil -lz -lm -lpthread -lbz2
? ? 說一下,為什么使用這個編譯命令。
? ? 首先,av_register_all()函數里面嵌套了更多的函數,他們的聲明在avcodec.h、avformat.h、avutil.h中,所以需要包含這三個頭文件,這一步做好了,可保證編譯不出錯;其次,鏈接階段,需要去找這些被聲明的函數的定義部分,所以需要鏈接這些庫,libavformat.a、libavcodec.a、libavutil.a、z庫、m庫(數學庫)、pthread庫(線程庫)、bz2庫。所以必須-l鏈接這些歸檔庫,最后生成test二進制文件,試著運行吧。
六、總結
? ? 寫起來很簡單,就這五個步驟。但是我自己摸索著,一步一步走過來,理解了不少,可以看到,我之前做了很多準備工作(之前有幾篇blog就是做這些準備工作的記錄,比如編譯,庫的理解)。
? ? 有句話叫一通百通,真的弄懂這個了,不管遇到什么庫,什么API,只要真心搞懂了一種,其他的也是相似的。
? ? 接下來,就是一個基于ffmpeg的轉碼工具的設計實現了,為什么不直接做播放器呢?因為播放器需要SDL的相關知識,暫時我不會,而且播放也只是把解碼后的數據再進一步通過SDL庫來展現,所以轉碼工具就是基礎了,那么從基礎做起總沒壞處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449484.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449484.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

runC爆嚴重安全漏洞,主機可被攻擊!使用容器的快打補丁

容器的安全性一直是容器技術的一個短板。關于容器最大的安全隱患是攻擊者可以使用惡意程序感染容器,更嚴重時可以攻擊主機系統。 2月11日,安全研究員Adam Iwaniuk和BorysPop?awski發現了容器運行時runC的一個安全漏洞,這個漏洞可以讓上述情況…

pandas操作sql數據庫

導包 import pymssql from sqlalchemy import create_engine import pandas as pd 連接數據庫 #讀數據 conn pymssql.connect(server.,user sa,password test,databasepos) sql select * from stock_data df0 pd.read_sql(sql,conn) 寫入數據 df pd.read_csv(option_…

MongoDB Mobile Sync for iOS推出Beta版本

2019年2月11日,MongoDB官方博客發文稱MongoDB Mobile Sync for iOS的Beta版本即將推出。MongoDB Mobile支持使用單一查詢語言進行本地和遠程數據訪問,包含兩個核心部分: MongoDB數據庫的移動優化版本,運行在本地設備上&#xff0c…

gdb好文章:GDB十分鐘教程

(GUI調試器:insight和ddd) list(l) :其作用就是列出程序的源代碼,默認每次顯示10行。 list 行號:將顯示當前文件以“行號”為中心的前后10行代碼,如:list 12 list 行號1,行號2: 將…

機器學習預測+akshare

import pandas as pd import akshare as ak import numpy as np import talib from datetime import datetime, timedelta import time 獲取股票數據 from_date 2010-01-01 from_date datetime.strptime(from_date,"%Y-%m-%d") day_nums 1 current_dt time.st…

[python作業AI畢業設計博客]比Selenium IDE更好用的錄制工具: Katalon Recorder

Selenium IDE(集成開發環境 Integrated Development Environment)是用于構建測試腳本的原型工具。 它是一個Firefox插件,提供了易于使用的界面,用于開發自動化測試。 但是最新的Selenium IDE總是彈出一系列如下的對話框,不能直接錄制&#xf…

CentOS 7 : Docker私有倉庫搭建和使用

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 系統環境: CentOS 7.2 192.168.0.179:docker倉庫 192.168.0.60:客戶端 安裝并啟動docker yum -y…

價值投資/指標選股(akshare)

利用akshare的數據源,可以獲取所有的股票數據以及公開的財務數據,可以進行條件篩選,獲取滿足條件的股票。 這套模板可以用于價值投資,指標選股。選股周期為日線級別。然后結果可以郵箱發送。 import time import akshare as ak #…

gdb常用命令

[rootredhat home]#gdb 調試文件:啟動gdb (gdb) l :(字母l)從第一行開始列出源碼 (gdb) break n :在第n行處設置斷點 (gdb) break func:在函數func()的入口處設置斷點 (gdb) info break: 查看斷點信息 (gdb…

有前途的人工智能大數據分析相關職業:Python數據科學入門之路

2019獨角獸企業重金招聘Python工程師標準>>> 為什么學習Python數據科學? Python是數據科學職業所需的寶貴技能之一。Python是數據科學的首選編程語言。 2016年,它超越了R on Kaggle,這是數據科學競賽的首選平臺。2017年&#xff0…

遍歷Map key-value的兩種方法、遍歷Set方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 第一種遍歷方法 : 先獲取Map中的所有key值&#xff0c;然后根據key&#xff0c;依次從Map中去數據 Map<String,String> test…

STL 容器簡介:C++ 容器:順序性容器、關聯式容器和容器適配器

STL標準容器類簡介 標準容器類說明順序性容器vector從后面快速的插入與刪除&#xff0c;直接訪問任何元素deque從前面或后面快速的插入與刪除&#xff0c;直接訪問任何元素list雙鏈表&#xff0c;從任何地方快速插入與刪除關聯容器set快速查找&#xff0c;不允許重復值multise…

用友云開發者中心助你上云系列之在線調試

現在&#xff0c;大家開始越來越多的談論到高可用架構的互聯網應用。什么是高可用&#xff1f;高可用HA&#xff08;High Availability&#xff09;是分布式系統架構設計中必須考慮的因素之一&#xff0c;它通常是指&#xff0c;通過設計減少系統不能提供服務的時間。當我們談論…

python根據財務指標尋找價值股票

確定股票池 from concurrent.futures import ThreadPoolExecutor import urllib import os from time import sleep import pandas as pd # 上證代碼 shanghaicode [] for i in range(600000, 606000, 1):shanghaicode.append(str(i))# 深證代碼 shenzhencode [] for i in r…

WPF Bitmap轉BitmapSource,Image

//引用&#xff1a;using System.Windows.Interop; //Imagingusing System.Drawing; //Bitmap public static Imaging.BitmapSource ConvertToBitmapSource(Bitmap btmap) { return Imaging.CreateBitmapSourceFromHBitmap(btmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empt…

解決jboss.resteasy.spi.UnhandledException: Response is committed, can‘t handle exception

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff0c;如圖&#xff1a; 我的情況是&#xff1a;項目作壓測&#xff0c;這個接口請求量不大時是OK的 &#xff0c;當達到…

linux下如何做ghost,又簡單又方便,很實用的方法!!!

Linux 做ghost 使用指南。 轉載時請注明本博客地址。 1. 使用unetbootin-windows-585.exe 軟件做 ubuntu 的liveusb &#xff0c;一定是做liveusb&#xff0c;不是liveCD&#xff0c;如果你做的是liveCD&#xff0c;要把做好的文件拷出來&#xff0c;否則&#xff0c;重…

Webpack4: Tree-shaking 深度解析

什么是Tree-shaking 所謂Tree-shaking就是‘搖’的意思&#xff0c;作用是把項目中沒必要的模塊全部抖掉&#xff0c;用于在不同的模塊之間消除無用的代碼&#xff0c;可列為性能優化的范疇。 Tree-shaking早期由rollup實現&#xff0c;后來webpack2也實現了Tree-shaking的功能…

真格量化——GFTD策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import numpy as np import math#開始時間,用于初始化一些參數 def OnStart(context) :print "I\m starting..."#設置全局變量g.signalcount = 0 g.signal_list = []g.buysignal = 0 g…

解決org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff1a; org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql alias [id]…