Packaging FFMpeg as RPM - muzee-git/ffmpeg_icy GitHub Wiki

為什麼需要編譯成 RPM

編譯成 RPM 可以節省在 Server 上的安裝時間,只要下載 RPM 與將事先編譯好的檔案複製至指定的路徑即可。特別是在 IaaS VM 裡時,若啟用的 Instance 等級不高的情況,編譯會很久。

此外,若每回都要從無到有編譯 FFmpeg 那不同的人可能使用了不同的編譯選項而渾然不知。以我們的版本要配合 librtmp 使用的,若沒有啟用這個選項,使用 FFmpeg 內建的 rtmp demuxer 效能不如 librtmp 來得好,甚至它有可能會卡在 protocol 資料存取。

另一個讀者心中可能有的疑問是:『為什麼是 RPM,而不是 deb 或其它格式?』。這是因為我們部署在 AWS EC2 上的程式是使用 Amazon Linux AMI,它與 CentOS 相近也是使用 RPM 打包軟體的。若未來主要的部署 Linux Distribution 換了,格式不再是 RPM 時,就需要提供不用的說明文件。

需要深入學習 RPM 的製作嗎?

若有時間最好能學習製作 RPM,若沒有時間可以使用既有的 RPM SPEC 來定義編譯工作。基礎知識可參考 Rpmbuild Tutorial 或有使用 RPM 作為 Software Package Format 的 Linux Distrubtion 的相關手冊。有了 RPM 製作的技能後,你才有可能『從無到有』將 FFmpeg 打包成 RPM 檔。在有舊版的 SRPM 的情況下,我們能由此檔解出編譯 RPM 需要的目錄結構,以此目錄為範本進行更新,重新打包並部署新的 RPM。

PS. 最好能準備一台 CentOS 6.x 的 VM 來做練習與打包的工作。由於我們部署的是 64 位元版,你的 OS 也應安裝 64 位元版本。

釋出 RPM 的步驟

  1. 下載上一份釋出的 Muzee FFmpeg Source RPM (muzee.ffmpeg-0.9.3-1.el6.src.rpm)
  2. 使用 rpmbuild 指令由 SRPC 內解開需要的檔案

先清除舊的 $HOME/rpmbuild 目錄,以免不同的 RPM 檔案混在一起

[qrtt1@qty ~]$ rm -rf rpmbuild/

使用 --rebuild 指令達到解開 rpmbuild 目錄的效果 muzee.ffmpeg-0.9.3-1.el6.src.rpm,也能加上 --nobuild 讓它不要執行 rebuild 的動作(如果記不起來,按 Ctrl+C 終止也行)

[qrtt1@qty ~]$ rpmbuild --rebuild --nobuild muzee.ffmpeg-0.9.3-1.el6.src.rpm
Installing muzee.ffmpeg-0.9.3-1.el6.src.rpm
warning: user rpm does not exist - using root
warning: group rpm does not exist - using root
warning: user rpm does not exist - using root
warning: group rpm does not exist - using root
Processing files: muzee.ffmpeg-0.9.3-1.el6.x86_64
error: File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/bin/*
error: File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/include/*
error: File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/lib64/*
error: File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/share/ffmpeg/*


RPM build errors:
  user rpm does not exist - using root
  group rpm does not exist - using root
  user rpm does not exist - using root
  group rpm does not exist - using root
  File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/bin/*
  File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/include/*
  File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/lib64/*
  File not found by glob: /home/qrtt1/rpmbuild/BUILDROOT/muzee.ffmpeg-0.9.3-1.el6.x86_64/usr/share/ffmpeg/*

  1. 修改 SPEC 檔(版本、原始碼 ZIP 檔檔名、其他重要資訊)

rpmbuild 目錄結構如下,其中 ffmpeg.spec 即為 SPEC 檔,我們要修改它的內容。而 SOURCES 下的 zip 檔需要換上將被編譯的 FFmpeg 的原始碼

qrtt1@qty ~]$ tree rpmbuild/
rpmbuild/
|-- BUILD
|-- BUILDROOT
|-- RPMS
|-- SOURCES
|   `-- ffmpeg_icy-m0.9.3.zip
|-- SPECS
|   `-- ffmpeg.spec
`-- SRPMS

6 directories, 2 files

由使舊 SEPC 修改成所需的 SPEC 檔

由 SRPC 取得的 SPEC 如下

Name:           muzee.ffmpeg
Version:        0.9.3
Release:        1%{?dist}
Summary:        ffmpeg fork by muzee

Group:          Development/Libraries
License:        LGPLv2
URL:            https://github.com/muzee-git/ffmpeg_icy/tree/m0.9.3
Source0:        ffmpeg_icy-m0.9.3.zip
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires:  rtmpdump
#Requires:       

%description


%prep
%setup -n ffmpeg_icy-m0.9.3


%build
./configure --prefix=%{_prefix} --libdir=%{_libdir} --enable-librtmp \
--disable-doc \
--disable-ffserver --disable-avdevice \
--disable-postproc --disable-avfilter --disable-bsfs \
--disable-filters --disable-avconv \
--disable-asm 
make %{?_smp_mflags}


%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT


%clean
rm -rf $RPM_BUILD_ROOT


%files
%defattr(-,root,root,-)
%{_bindir}/*
%{_includedir}/*
%{_libdir}/*
%{_datadir}/ffmpeg/*
%doc



%changelog

需要修改的有幾個部分,版本號需換成新的,不然會與既有的版本衝突;URL 也要換上新的 github 連結,否則到時想要修改不知重何改起;Source0 為新的 ZIP 檔的名稱,也有人採用不帶版號的名稱。

Name:           muzee.ffmpeg
Version:        0.9.3
Release:        1%{?dist}
Summary:        ffmpeg fork by muzee

Group:          Development/Libraries
License:        LGPLv2
URL:            https://github.com/muzee-git/ffmpeg_icy/tree/m0.9.3
Source0:        ffmpeg_icy-m0.9.3.zip
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

修改為 0.9.4 版後的內容:

Name:           muzee.ffmpeg
Version:        0.9.4
Release:        1%{?dist}
Summary:        ffmpeg fork by muzee

Group:          Development/Libraries
License:        LGPLv2
URL:            https://github.com/muzee-git/ffmpeg_icy/tree/m0.9.4_librtmp
Source0:        ffmpeg_icy-m0.9.4.zip
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

除了上述基本的訊息外,還有 %setup 要注意,原先我們寫成:

%prep
%setup -n ffmpeg_icy-m0.9.3

其中 -n ffmpeg_icy-m0.9.3 是 RPM 工具,解開 ZIP 檔至暫存目錄後,要進的目錄。當初在包 ffmpeg_icy-m0.9.3.zip 時,我們用的目錄名為 ffmpeg_icy-m0.9.3,所以這裡填的才會是 -n ffmpeg_icy-m0.9.3。新包的 0.9.4 版,我們打包進 ZIP 檔的目錄名為 ffmpeg_icy,所以它應該改成:

%prep
%setup -n ffmpeg_icy

編譯 RPM

完成 SPEC 修改後,我們能用 rpmbuild 重編它(-ba 是打包 RPM 與 SRPM)

[qrtt1@qty SPECS]$ rpmbuild -ba ffmpeg.spec 

編譯完工後,你會有二個檔案:

[qrtt1@qty rpmbuild]$ tree SRPMS RPMS
SRPMS
`-- muzee.ffmpeg-0.9.4-1.el6.src.rpm
RPMS
`-- x86_64
    `-- muzee.ffmpeg-0.9.4-1.el6.x86_64.rpm

1 directory, 2 files

使用 muzee.ffmpeg-0.9.4-1.el6.x86_64.rpm 在 EC2 上試著安裝,看是否能完成安裝並且可以正常使用。

軟體更新

下載要更新的 RPM 至 EC2 Instance

[ec2-user@ip-10-136-133-128 ~]$ wget http://s3.amazonaws.com/muzee.tools/RPMS/muzee.ffmpeg-0.9.4-1.el6.x86_64.rpm
--2013-09-30 06:43:32--  http://s3.amazonaws.com/muzee.tools/RPMS/muzee.ffmpeg-0.9.4-1.el6.x86_64.rpm
Resolving s3.amazonaws.com (s3.amazonaws.com)... 207.171.187.117
Connecting to s3.amazonaws.com (s3.amazonaws.com)|207.171.187.117|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11484608 (11M) [application/x-rpm]
Saving to: ‘muzee.ffmpeg-0.9.4-1.el6.x86_64.rpm’

100%[==================================================================================================================================================================================================>] 11,484,608  1009KB/s   in 18s    

2013-09-30 06:43:50 (638 KB/s) - ‘muzee.ffmpeg-0.9.4-1.el6.x86_64.rpm’ saved [11484608/11484608]

先使用 rpm query 查看是否有已經版本:

[ec2-user@ip-10-136-133-128 ~]$ rpm -qa|grep ffmpeg
muzee.ffmpeg-0.9.3-1.el6.x86_64

版本比它新,可使使用 -U 更新指令進行軟體更新

[ec2-user@ip-10-136-133-128 ~]$ sudo rpm -Uvh muzee.ffmpeg-0.9.4-1.el6.x86_64.rpm
Preparing...                ########################################### [100%]
   1:muzee.ffmpeg           ########################################### [100%]

若版本比較舊,可先移除它,再用安裝。

PS. 若先前無安裝過,需要安裝相依的 RPM 再進行安裝。