1.モバイルアプリの機能の簡単な説明
1)JZ2440開発ボードはカメラ監視デバイスおよびストリーミングサーバーとして機能し、収集したカメラビデオデータをwifi経由でリアルタイムで携帯電話アプリに送信します
2)モバイルアプリはクライアントとして機能し、WiFi経由でストリーミングサーバーからカメラビデオを受信し、画面に表示します
3)表示モードのサポート:全画面表示またはアスペクト比の維持
4)サポート:ディスプレイFPSフレームレート
5)サポートカメラ機能:ビデオのフレームをjpeg画像として保存
6)写真の閲覧と削除をサポート
7)(新)ビデオ録画機能をサポート:ビデオのセグメントをmkvビデオファイルとして保存
8)(新)ビデオの閲覧と削除をサポート
第二に、概略設計
2.1技術的な選択
FFmpegはオープンソースのマルチメディアオーディオおよびビデオ処理ツールで、Linux、Windows、Mac、Androidなどのさまざまなプラットフォームに適用できます。ビデオ再生、フォーマット変換、スクリーンショット、後処理など、その機能も非常に強力です。さまざまなビデオおよびオーディオ形式をサポートします。参考までに、インターネットには多くの成功事例があります。
そのため、FFmpegを使用して携帯電話アプリの録画機能を実現することにしました。
2.2開発計画
1)FFmpegとFreeTypeの移植
2)アプリの元のフレームワークの変更(元のフレームワークはAndroid SDKに基づいています(mjpegからのbmpの解析、表示、fpsの追加、写真の撮影などを含む)、FFmpegを呼び出すJNIレイヤーで実装する必要があります)
実装のアイデア:機能モジュールで分割し、各モジュールを1つずつ実装し、最後に各モジュールを統合します。モジュールは次のように分かれています。
i)(メインモジュール)ビデオのキャプチャと再生
ii)表示モードの切り替え
iii)写真を撮る
iv)ビデオ
v)fpsディスプレイ
vi)ビデオの閲覧と削除
3.開発環境
3.1 Androidアプリ開発環境
3.1.1オペレーティングシステム
Windows10バージョン1909
3.1.2 IDE
Android Studio 3.6.1
注:元のStudioが新しいバージョンのStudioに直接アップグレードされないようにするために、以前のプロジェクトをインポートするときに問題が発生する可能性があります。インストール不要のバージョンをダウンロードし、元のAndroid SDKフォルダーを新しいバージョンの新しいSDKフォルダーにコピーすることをお勧めしますAndroidStudio。リファレンス:AndroidStudio(2.3および3.0)の複数のバージョンの共存
3.1.3プロジェクト構造
1)gradleバージョン
2)SDKの場所とNDKの場所
注:SDKの場所にスペースを含めることはできません。そうしないと、その下のNDKパスにもスペースが含まれ、cmakeを使用してJNIプロジェクトをビルドするときにスペースがファイルセパレーターと間違えられます。
3)コンパイルSDKバージョンとビルドツールバージョン
4)ターゲットSDKのバージョンとMin SDKのバージョン
3.2 ffmpegとFreeTypeクロスコンパイル環境
a) Vmware版本:Vmware Workstation 12.5.7
b)Ubuntuバージョン:Ubuntu 16.04.4 LTS(私はBaiwen.com JZ2440情報ディスク_20180516のバージョンを使用しました。アドレスはhttp://wiki.100ask.org/Downloadで、次に見つかりました:002_JZ2440情報ディスク_20180516(無料))
c)カーネルのバージョン:4.13.0
d)gccバージョン:5.4.0
e)NDKバージョン:android-ndk-r15c-linux-x86_64.zip
3.3アプリのデバッグに使用するターゲットデバイス
Huawei Enjoy 9S
4番目に、FreeType-2.9.1およびFFmpeg-n3.4.5をAndroidに移植します。
プロセスをスキップしてコンパイル済みライブラリを直接使用する場合は、次のアドレスからダウンロードできます。https://pan.baidu.com/s/1HV-4TB95SPeUqyNDiK68Eg抽出コード:39xb
ただし、他のマシンではテストされておらず、使用できることが保証されていません
注:NDKクロスコンパイル環境のインストール、FreeTypeおよびFFmpegのクロスコンパイルは、すべてUbuntu仮想マシンで実行する必要があります。
4.1 NDKクロスコンパイル環境をダウンロードしてインストールする
(/フォルダへのダウンロードを想定)
ダウンロードアドレス:https : //dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip?hl=zh_cn
ダウンロード後、android-ndk-r15c-linux-x86_64.zipを解凍して解凍します。
4.2 NDKスタンドアロンツールチェーンをインストールする
参考:Android NDKクロスコンパイルセットアップ(libpngおよびfreetype)
4.2.1 armv7バージョンのNDKスタンドアロンツールチェーンをインストールします(/ opt / android-extフォルダーにインストールされている場合)
シェルターミナルで次のコマンドを実行します。
PLATFORM_PREFIX = / opt / android-ext /をエクスポートします
エクスポートNDK_PATH = / work / android-ndk-r15c /
NDK_PLATFORM = android-21をエクスポートします
mkdir $ PLATFORM_PREFIX
$ NDK_PATH / build / tools / make-standalone-toolchain.sh --platform = $ NDK_PLATFORM --install-dir = $ PLATFORM_PREFIX
4.2.2 NDKスタンドアロンツールチェーンのarm64バージョンをインストールします(/ opt / android-ext-arm64フォルダーにインストールされていると仮定)
(手順はNDKスタンドアロンツールチェーンのarm7vバージョンのインストールと同様です)
シェルターミナルで次のコマンドを実行します。
PLATFORM_PREFIX = / opt / android-ext-arm64 /をエクスポートします
エクスポートNDK_PATH = / work / android-ndk-r15c /
NDK_PLATFORM = android-21をエクスポートします
mkdir $ PLATFORM_PREFIX
$ NDK_PATH / build / tools / make-standalone-toolchain.sh --platform = $ NDK_PLATFORM --install-dir = $ PLATFORM_PREFIX --arch = arm64
4.3 FreeType-2.9.1の移植
4.3.1 FreeType-2.9.1をダウンロードして解凍します(/work/freetype-2.9.1フォルダーに解凍すると仮定)
ダウンロードアドレス:https : //download.savannah.gnu.org/releases/freetype/freetype-2.9.1.tar.gz
ダウンロードが完了したら、tar –xzvf freetype-2.9.1.tar.gzを実行して解凍します
4.3.2 FreeType-2.9.1のクロスコンパイル
1)/work/freetype-2.9.1フォルダーに移動し、次の内容のbuild_freetype.shスクリプトファイルを作成します。
#!/ bin / bash
NDK = / work / android-ndk-r15c
function configure
{
CPU = $ 1
PREFIX = $(pwd)/ android / $ CPU
TOOLCHAIN = ""
SYSROOT = ""
HOST = ""
if ["$ CPU "==" armv7-a "]
次に
TOOLCHAIN = / opt / android-ext / bin /
SYSROOT = $ NDK / platforms / android-21 / arch-arm /
HOST = arm-linux-androideabi
else
TOOLCHAIN = / opt / android -ext-arm64 / bin /
SYSROOT = $ NDK / platforms / android-21 / arch-arm64 /
HOST = aarch64-linux-android
fi
export PATH = $ TOOLCHAIN:$ PATH
。/ configure \
--with-png = no \
--with-zlib = no \
--host = $ HOST \
--prefix = $ PREFIX \
--with-sysroot = $ SYSROOT
}
build()
{
make clean
cpu = $ 1
echo "build $ cpu"
configure $ cpu
echo "configure done。CFLAGS :$ CFLAGS \ n PATH:$ PATH"
echo "start make ..."
#mod on 2020-03-30 ZGで
#メイク-J4
-j2作る
「行わせる。」エコー
echo "start make install ..."
make install
echo "make install done。"
}
ビルドarm64
ビルドarmv7-a
2)シェルターミナルで次のステートメントを実行します
chmod –R 777 build_freetype.sh
./build_freetype.sh
最終的なコンパイルが成功すると、次のようになります。
- 在/work/freetype-2.9.1/android/arm64/lib中生成arm64版本的libfreetype.a静态库和libfreetype.so动态库
- 在/work/freetype-2.9.1/android/armv7-a/lib中生成armv7版本的libfreetype.a静态库和libfreetype.so动态库
4.4 移植FFmpeg到android
参考:FFmpeg一键编译Android arm64位和32位共享库
4.4.1 下载解压FFmpeg-n3.4.5(假设解压到/work/FFmpeg-n3.4.5文件夹下)
下载地址:https://github.com/FFmpeg/FFmpeg/archive/n3.4.5.tar.gz
下载完成后执行tar –xzvf FFmpeg-n3.4.5.tar.gz解压即可
4.4.2 下载解压X264
下载地址:https://code.videolan.org/videolan/x264/-/archive/stable/x264-stable.tar.gz
将x264下载到FFmpeg源码根目录,执行tar -zxvf x264-stable.tar.gz解压,然后将解压出来的目录x264-stable重命名为x264
4.4.3 交叉编译X264
1)进入x264源码目录,新建build.sh,内容如下:
#!/bin/bash NDK=/work/android-ndk-r15c configure() { CPU=$1 PREFIX=$(pwd)/android/$CPU HOST="" CROSS_PREFIX="" SYSROOT="" if [ "$CPU" == "armv7-a" ] then HOST=arm-linux SYSROOT=$NDK/platforms/android-26/arch-arm/ CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi- else HOST=aarch64-linux SYSROOT=$NDK/platforms/android-26/arch-arm64/ CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android- fi ./configure \ --prefix=$PREFIX \ --host=$HOST \ --enable-pic \ --enable-static \ --enable-neon \ --extra-cflags="-fPIE -pie" \ --extra-ldflags="-fPIE -pie" \ --cross-prefix=$CROSS_PREFIX \ --sysroot=$SYSROOT } build() { make clean
cpu=$1
echo "build $cpu"
configure $cpu #-j<CPU核心数> make -j2 make install } build arm64 build armv7-a
2) 在shell终端执行以下语句
chmod –R 777 build.sh
./build.sh
编译成功后,会分别在android/armv7-a/lib和android/arm64/lib目录下找到编译好的静态库libx264.a。
4.4.4 交叉编译FFmpeg-n3.4.5
1)修改configure
进入FFmpeg源码根目录,用vim打开configure,找到
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
将其修改为
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
2)进入FFmpeg源码根目录,新建build_ffmpeg.sh,内容如下:
#!/bin/bash
NDK=/work/android-ndk-r15c ADDI_CFLAGS="-fPIE -pie" ADDI_LDFLAGS="-fPIE -pie" export TMPDIR="/tmp" configure() { CPU=$1 PREFIX=$(pwd)/android/$CPU x264=$(pwd)/x264/android/$CPU HOST="" CROSS_PREFIX="" SYSROOT="" ARCH="" FREETYPE_INCLUDE=/work/freetype-2.9.1/android/$CPU/include FREETYPE_LIB=/work/freetype-2.9.1/android/$CPU/lib if [ "$CPU" == "armv7-a" ] then echo "build $cpu" ARCH="arm" HOST=arm-linux SYSROOT=$NDK/platforms/android-21/arch-arm/ CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi- else ARCH="aarch64" HOST=aarch64-linux SYSROOT=$NDK/platforms/android-21/arch-arm64/ CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android- fi ./configure \ --prefix=$PREFIX \ --disable-encoders \ --disable-decoders \ --enable-avdevice \ --disable-static \ --disable-doc \ --disable-ffplay \ --enable-network \ --disable-doc \ --disable-symver \ --enable-neon \ --enable-shared \ --enable-libx264 \ --enable-gpl \ --enable-pic \ --enable-jni \ --enable-pthreads \ --enable-mediacodec \ --enable-encoder=aac \ --enable-encoder=gif \ --enable-encoder=libopenjpeg \ --enable-encoder=libmp3lame \ --enable-encoder=libwavpack \ --enable-encoder=libx264 \ --enable-encoder=mpeg4 \ --enable-encoder=pcm_s16le \ --enable-encoder=png \ --enable-encoder=srt \ --enable-encoder=subrip \ --enable-encoder=yuv4 \ --enable-encoder=text \ --enable-encoder=mjpeg \ --enable-decoder=aac \ --enable-decoder=aac_latm \ --enable-decoder=libopenjpeg \ --enable-decoder=mp3 \ --enable-decoder=mpeg4_mediacodec \ --enable-decoder=mjpeg \ --enable-decoder=pcm_s16le \ --enable-decoder=flac \ --enable-decoder=flv \ --enable-decoder=gif \ --enable-decoder=png \ --enable-decoder=srt \ --enable-decoder=xsub \ --enable-decoder=yuv4 \ --enable-decoder=vp8_mediacodec \ --enable-decoder=h264_mediacodec \ --enable-decoder=hevc_mediacodec \ --enable-hwaccel=h264_mediacodec \ --enable-hwaccel=mpeg4_mediacodec \ --enable-ffmpeg \ --enable-bsf=aac_adtstoasc \ --enable-bsf=h264_mp4toannexb \ --enable-bsf=hevc_mp4toannexb \ --enable-bsf=mpeg4_unpack_bframes \ --enable-libfreetype \ --enable-cross-compile \ --cross-prefix=$CROSS_PREFIX \ --target-os=android \ --arch=$ARCH \ --sysroot=$SYSROOT \ --extra-cflags="-I$x264/include -I$FREETYPE_INCLUDE $ADDI_CFLAGS" \ --extra-ldflags="-L$x264/lib -L$NDK/platforms/android-21/arch-$CPU/usr/lib -L$FREETYPE_LIB -llog -lfreetype" } build() { make clean cpu=$1 echo "build $cpu" configure $cpu #mod on 2020-03-30 by zg # make -j4 make -j2 make install } build arm64 build armv7-a
3) 在shell终端执行以下语句
chmod –R 777 build_ffmpeg.sh
./build_ffmpeg.sh
コンパイルが成功すると、コンパイルされた動的ライブラリはandroid / armv7-a / libおよびandroid / arm64 / libディレクトリにあります。
V.参考資料
1)NDKクロスコンパイル環境
Android NDKクロスコンパイルのセットアップ(libpngおよびfreetype)
2)FreeTypeの移植
FreeType2.9 NDKコンパイル(FFmpegコンパイル3)
3)FFmpegの移植