NDK-从零开始使用FFmpeg搭建框架播放音视频0

NDK-从零开始使用FFmpeg搭建框架播放音视频0

  • FFmpeg简介
  • 编译FFmpeg

  本篇博文主要是简单介绍下FFmpeg,以及在Linux下如何编译FFmpeg。读者如果已经对FFmpeg了解了,可以跳过本篇。

FFmpeg简介

  FFmpeg是广泛使用的多媒体解决方案,几乎音视频方面的开发者没有不知道它的。之所以应用这么广泛,是因为其功能强大,所以学习FFmpeg是音视频开发者所必须的。
  FFmpeg是一个自由软件项目的名称。它提供了录制、转换以及流化音视频的完整解决方案。它包含非常先进的音频/视频解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里的很多代码都是新开发的,“FFmpeg”这个单词中的“FF”指的是“Fast Forward”,而“mpeg”指一种压缩率比较大的活动图像和声音的压缩标准。发音是:“ef ef em peg“。

编译FFmpeg

  FFmpeg是由C代码组成的,功能多,代码量大。在Android平台使用需要先编译,后使用。编译可以在linux系统中(可以使用虚拟机安装Ubuntu或者云服务器)使用makefile语法进行编译。
  FFmpeg下载页入口
  进入下载页后,在download处点击进去http://ffmpeg.org/download.html
NDK-从零开始使用FFmpeg搭建框架播放音视频0_第1张图片
右键,复制链接地址:https://ffmpeg.org/releases/ffmpeg-4.2.tar.bz2
NDK-从零开始使用FFmpeg搭建框架播放音视频0_第2张图片
打开虚拟机下载使用指令下载:wget https://ffmpeg.org/releases/ffmpeg-4.2.tar.bz2
NDK-从零开始使用FFmpeg搭建框架播放音视频0_第3张图片
下载完后还需要下载ndk,这里下载ndk17的版本,下载页地址入口
NDK-从零开始使用FFmpeg搭建框架播放音视频0_第4张图片
还是右键复制链接地址到虚拟机下载:wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh_cn
下载完后是这两个文件:
在这里插入图片描述
使用 tar xvf ffmpeg-4.2.tar.bz2 解压ffmpeg。
使用 unzip android-ndk-r17c-linux-x86_64.zip 解压ndk。
NDK-从零开始使用FFmpeg搭建框架播放音视频0_第5张图片
解压完后,先配置下ndk的环境,使用命令 vim /etc/profile
进入文件夹后,在最后行添加:
NDK-从零开始使用FFmpeg搭建框架播放音视频0_第6张图片
NDKROOT对应的是ndk目录下的路径。保存完后使用命令: source /etc/profile 使/etc/profile里的配置立即生效。接下来进入到ffmpeg文件夹 cd ffmpeg-4.0.2/
使用vim build.sh生成文件,文件内容如下:

#!/bin/bash
NDK_ROOT=/root/ndk/android-ndk-r17c
#TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/
#FLAGS与INCLUDES变量 可以从AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是**地址**
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -O0 -fPIC"
INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include"

#执行configure脚本,用于生成makefile
#--prefix : 安装目录
#--enable-small : 优化大小
#--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。
#--disable-avdevice : 关闭avdevice模块,此模块在android中无用
#--disable-encoders : 关闭所有编码器 (播放不需要编码)
#--disable-muxers :  关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭
#--disable-filters :关闭视频滤镜
#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )
#--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-
#disable-shared enable-static 不写也可以,默认就是这样的。
#--sysroot: 
#--extra-cflags: 会传给gcc的参数
#--arch --target-os :
PREFIX=./android/armeabi-v7a2
./configure \
--prefix=$PREFIX \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot" \
--arch=arm \
--target-os=android 

make clean
make install

上面的NDK_ROOT还是得改成自己ndk的路径,其他的参数上面的注释已经很清楚了。
接下来保存退出后,运行脚本./build.sh,生成android文件夹。将android文件夹从虚拟机拉取到电脑的桌面。
打开android文件夹看下NDK-从零开始使用FFmpeg搭建框架播放音视频0_第7张图片
NDK-从零开始使用FFmpeg搭建框架播放音视频0_第8张图片
里面包含有libavcodec、libavfilter、libavformat、libavutil、libswresample、libswscale。
libavcodec:用于各种类型声音/图像编解码;该库是音视频编解码核心库,实现了市面上课件的绝大部分编解码器的功能。
libavfilter:filter(FileIO、FPS、DrawText)音视频滤波器的开发,比如宽高、裁剪、格式化、非格式化、伸缩等。
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频等功能。音视频的格式解析协议,为libavcodec分析码流提供独立的音频或视频码流源。
libavutil:包含一些公共的工具函数的使用库,包括算数运算、字符操作等。
libswresample:原始音频格式转码。
libswscale:(原始视频格式转换)用于视频场景比例缩放、色彩映射转换、图像颜色空间或格式转换、入RGB565、RGB8888等于YUV等之间的转换。

至此,linux编译ffmpeg完成,下篇博文正式进入FFmpeg搭建框架播放音视频。

你可能感兴趣的:(Android)