从零开始的ffmpeg动态库编译

最近项目需要做ffmpeg的armV8(64位)的动态库的编译,所以研究下。

背景知识:

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库 libavcodec 等。

libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。

libavcodec:用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。

libavdevice :硬 件 采 集 、 加 速 、 显 示 。 操 作 计 算 机 中 常 用 的 音 视 频 捕 获 或 输 出 设 备 :ALSA,AUDIO_BEOS,JACK,OSS,1394,VFW。

libavfilter:filter(FileIO、FPS、DrawText)音视频滤波器的开发,如宽高比 裁剪 格式化 非格式化 伸缩。

libavutil:包含一些公共的工具函数的使用库,包括算数运算 字符操作;

libavresample:音视频封转编解码格式预设等。

libswscale:(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。

libswresample:原始音频格式转码

libpostproc:(同步、时间计算的简单算法)用于后期效果处理;音视频应用的后处理,如图像的去块效应。

ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

ffsever:一个 HTTP 多媒体即时广播串流服务器;

ffplay:是一个简单的播放器,使用 ffmpeg 库解析和解码,通过 SDL 显示

转自

一、编译环境搭建

环境配置:

VMWare Workstation 12(VMware-workstation-full-12.5.7.20721 激活码自行百度)

软件安装_VMware Workstation 12 Pro 安装_百度经验

ubuntu(ubuntu-16.04.2-desktop-amd64.iso)

怎样在VMware虚拟机中使用安装并设置Ubuntu系统_百度经验

ndk (android-ndk-r10d-linux-x86_64.bin)

下载地址(请用迅雷下载,你懂的)

ffmpeg(ffmpeg-3.3.2.tar.bz2)

下载地址

这玩意儿挺简单的,

ndk这个直接 ./android-ndk-r10d-linux-x86_64.bin

ffmpeg这个就 tar -jxvf ffmpeg-3.3.2.tar.bz2

不细说了,如果安装有问题可以找我。

二、编译脚本

其实我是参考了几个脚本改出来的,这里是arm64位的,什么v6 v7脚本,网上一大堆,直接就能用。

v8的成熟的反正我没找到,现在给出我改的脚本吧

如果你用的ndk跟我一样,只需要ANDROID_NDK_ROOT就行,这个是你解压的路径

我解压后是这样的

#!/bin/bash

mkdir -p ./build/android

chmod 777 ./configure

chmod 777 ./version.sh

export ANDROID_NDK_ROOT=/home/yuki/ndk10d/android-ndk-r10d

export ARM_ROOT=$ANDROID_NDK_ROOT

export ARM_INC=$ARM_ROOT/platforms/android-21/arch-arm64/usr/include/

export ARM_LIB=$ARM_ROOT/platforms/android-21/arch-arm64/usr/lib

export ARM_TOOL=$ARM_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64

export ARM_LIBO=$ARM_TOOL/lib/gcc/aarch64-linux-android/4.9.x

export PATH=$ARM_TOOL/bin:$PATH

export ARM_PRE=arm-linux-androideabi

export PLATFORM=$ARM_ROOT/platforms/android-21/arch-arm64

CC=$ARM_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin

function build_one

{

./configure \

--target-os=linux \

--arch=aarch64 \

--enable-cross-compile \

--sysroot=$ARM_ROOT/platforms/android-21/arch-arm64 \

--cross-prefix=$ARM_TOOL/bin/aarch64-linux-android- \

--cc=$ARM_TOOL/bin/aarch64-linux-android-gcc \

--nm=$ARM_TOOL/bin/aarch64-linux-android-nm \

--extra-cflags="-fvisibility=hidden -fdata-sections -ffunction-sections -Os -fPIC -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300" \

--enable-shared \

--enable-static \

--disable-asm \

--enable-pic \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-avdevice \

--disable-doc \

--disable-symver \

--disable-debug \

--disable-encoders \

--disable-muxers \

--enable-avresample \

--disable-pthreads \

--enable-swresample \

make clean

make

}

build_one

$ARM_TOOL/bin/aarch64-linux-android-ar d libavcodec/libavcodec.a inverse.o golomb.o log2_tab.o reverse.o

$ARM_TOOL/bin/aarch64-linux-android-ar d libswresample/libswresample.a log2_tab.o

$ARM_TOOL/bin/aarch64-linux-android-ar d libavutil/libavutil.a log2_tab.o

$ARM_TOOL/bin/aarch64-linux-android-ar d libswscale/libswscale.a log2_tab.o

$ARM_TOOL/bin/aarch64-linux-android-ld \

-rpath-link=$ARM_LIB \

-L$PLATFORM/usr/lib \

-soname libffmpeg-8.so -shared -nostdlib -znoexecstack -Bsymbolic --whole-archive --no-undefined -o \

./android/libffmpeg-8.so \

libswresample/libswresample.a \

libavcodec/libavcodec.a \

libavformat/libavformat.a \

libavutil/libavutil.a \

libswscale/libswscale.a \

-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \

$ARM_TOOL/lib/gcc/aarch64-linux-android/4.9/libgcc.a


注意几个配置

--enable-shared 这个是编译出分散的.so

--enable-static 这个是编译出分散的.a

其实,执行build_one就能出来能用的.so了,不过有好几个,我们这边要求打成一个so包,于是有了下面那几行。

这个脚本放到ffmpeg的根目录下

我那个叫build_android_64.sh,给了可执行权限后直接执行

./build_android_64.sh

成功后可以查看下是否生成libffmpeg-8.so


绿色那个

接下来是应用了,我在研究,但是代码是公司的,所以不会写文章。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容