相关文章推荐
满身肌肉的高山  ·  SQL Server ...·  1 年前    · 
傲视众生的碗  ·  Hive ...·  1 年前    · 

概述
ExoPlayer是Google开源的Android平台媒体播放器。 它是Android的MediaPlayer API的替代品。
相比于IJKPlayer,EXOPlayer更易于拓展,功能更多,bug更少。ExoPlayer虽然不支持软解但是为开发者扩展软解预留了接口。
网上竟然搜不到ExoPlayer+软解的扩展实现,那就有必要来一篇了hhh。

预先准备:
1.下载NDK(要下载NDK r15c,高版本编译不过)
https://developer.android.com/ndk/downloads?hl=zh-cn
2.下载EXO源码
git clone https://github.com/google/ExoPlayer.git
git checkout release-v2

添加ffmpeg软解扩展:
1.找到这个目录ExoPlayer/extensions/ffmpeg/src/main/jni。
在这个目录下执行如下步骤
1.git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
2.cd ffmpeg && git checkout release/4.0
3.配置ffmpeg编译参数,需要添加具体的某种解码器可自行配置

COMMON_OPTIONS="\
 --target-os=android \
    --disable-static \
    --enable-shared \
    --disable-doc \
    --disable-programs \
    --disable-everything \
    --disable-avdevice \
    --disable-avformat \
    --disable-swscale \
    --disable-postproc \
    --disable-avfilter \
    --disable-symver \
    --disable-swresample \
    --enable-avresample \
    --enable-decoder=vorbis \
    --enable-decoder=opus \
    --enable-decoder=flac \
    --enable-decoder=alac \
    --enable-decoder=pcm_mulaw \
    --enable-decoder=pcm_alaw \
    --enable-decoder=mp3 \
    --enable-decoder=amrnb \
    --enable-decoder=amrwb \
    --enable-decoder=aac \
    --enable-decoder=ac3 \
    --enable-decoder=eac3 \
    --enable-decoder=dca \
    --enable-decoder=mlp \
    --enable-decoder=truehd \

4.根据要编译的架构编写编译脚本

ANDROID_NDK=/Users/hawkswang/ndk/android-ndk-r15c
HOST_PLATFORM=darwin-x86_64
./configure \
    --libdir=android-libs/armeabi-v7a \
    --arch=arm \
    --cpu=armv7-a \
    --cross-prefix="${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/${HOST_PLATFORM}/bin/arm-linux-androideabi-" \
    --sysroot="${ANDROID_NDK}/platforms/android-9/arch-arm/" \
    --extra-cflags="-march=armv7-a -mfloat-abi=softfp" \
    --extra-ldflags="-Wl,--fix-cortex-a8" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS} \

5.开始编译
make -j4 && make install-libs

执行完步骤5就可以看到在ffmpeg目录下生成了如图.so
[外链图片转存失败(img-wRGeZWlD-1563458349062)(http://km.oa.com/files/photos/pictures//20190326//1553572014_31.png)]

6.编写JNI(如果想要扩展更多功能的话)

7.交叉编译JNI接口
在目录下ExoPlayer/extensions/ffmpeg/src/main/jni
执行

ANDROID_NDK=/Users/hawkswang/ndk/android-ndk-r15c
HOST_PLATFORM=darwin-x86_64
${ANDROID_NDK}/ndk-build APP_ABI="armeabi armeabi-v7a arm64-v8a" -j4

[外链图片转存失败(img-lhDICtUo-1563458349065)(http://km.oa.com/files/photos/pictures//20190326//1553572387_41.png)]
执行完7步骤即会在出现如图.so

8.在Java层初始化播放器的时候传人EXTENSION_RENDERER_MODE_PREFER即使用扩展的软解进行解码。
[外链图片转存失败(img-phT5JiH0-1563458349065)(http://km.oa.com/files/photos/pictures//20190326//1553580223_93.png)]

下面是把第1~5部整合到一块的脚本;

#!/bin/bash
ANDROID_NDK=/Users/hawkswang/ndk/android-ndk-r15c
HOST_PLATFORM=darwin-x86_64
COMMON_OPTIONS="\
    --target-os=android \
    --disable-static \
    --enable-shared \
    --disable-doc \
    --disable-programs \
    --disable-everything \
    --disable-avdevice \
    --disable-avformat \
    --disable-swscale \
    --disable-postproc \
    --disable-avfilter \
    --disable-symver \
    --disable-swresample \
    --enable-avresample \
    --enable-decoder=vorbis \
    --enable-decoder=opus \
    --enable-decoder=flac \
    --enable-decoder=alac \
    --enable-decoder=pcm_mulaw \
    --enable-decoder=pcm_alaw \
    --enable-decoder=mp3 \
    --enable-decoder=amrnb \
    --enable-decoder=amrwb \
    --enable-decoder=aac \
    --enable-decoder=ac3 \
    --enable-decoder=eac3 \
    --enable-decoder=dca \
    --enable-decoder=mlp \
    --enable-decoder=truehd \
#(git -C ffmpeg pull || git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg) && \
cd ffmpeg && git checkout release/4.0 && \
./configure \
    --libdir=android-libs/armeabi-v7a \
    --arch=arm \
    --cpu=armv7-a \
    --cross-prefix="${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/${HOST_PLATFORM}/bin/arm-linux-androideabi-" \
    --sysroot="${ANDROID_NDK}/platforms/android-9/arch-arm/" \
    --extra-cflags="-march=armv7-a -mfloat-abi=softfp" \
    --extra-ldflags="-Wl,--fix-cortex-a8" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS} \
make -j4 && make install-libs && \
make clean && ./configure \
    --libdir=android-libs/arm64-v8a \
    --arch=aarch64 \
    --cpu=armv8-a \
    --cross-prefix="${ANDROID_NDK}/toolchains/aarch64-linux-android-4.9/prebuilt/${HOST_PLATFORM}/bin/aarch64-linux-android-" \
    --sysroot="${ANDROID_NDK}/platforms/android-21/arch-arm64/" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS} \
make -j4 && make install-libs && \
make clean && ./configure \
    --libdir=android-libs/armeabi \
    --arch=arm \
    --cpu=armv5 \
    --cross-prefix="${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/${HOST_PLATFORM}/bin/arm-linux-androideabi-" \
    --sysroot="${ANDROID_NDK}/platforms/android-9/arch-arm/" \
    --extra-cflags="-march=armv5 -mfloat-abi=softfp" \
    --extra-ldflags="-Wl,--fix-cortex-a8" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS} \
make -j4 && make install-libs && \
make clean
echo "Success !"
                    概述ExoPlayer是Google开源的Android平台媒体播放器。 它是Android的MediaPlayer API的替代品。相比于IJKPlayer,EXOPlayer更易于拓展,功能更多,bug更少。ExoPlayer虽然不支持软解但是为开发者扩展软解预留了接口。网上竟然搜不到ExoPlayer+软解的扩展实现,那就有必要来一篇了hhh。预先准备:1.下载NDK(要下载NDK...
				
ExoPlayer播放器不支持MP2音频格式,在播放视频为MP2音频格式的视频时,在华为悦盒E6108C系列的盒子上没有声音,为解决问题添加ExoPlayer的扩展ffmpeg软解码库,历时4天终于完成 准备:参考ExoPlayer的github文档 git ExoPlayer到本地 windows安装cygwin 参考:https://blog.csdn.net/chunleixiahe/...
第一种 vlc中的httplive.c /***************************************************************************** * httplive.c: HTTP Live Streaming stream filter **************************************************
-- Android 多媒体解决方案:Android MediaPlayer;FFmpeg;Google ExoPlayer;Vitamio;VLC。 1.Android MediaPlayer 是 Android 内置的播放器,支持格式很有限:3gp mp4,且不支持流媒体。 2.FFmpeg 是一套功能强大的跨平台多媒体解决方案,需要用NDK编译,支持海量格式、流媒体。 3.Googl...
视频分片上传是一种常见的大文件上传方式,可以有效地避免上传过程中网络不稳定、服务器压力过大等问题。下面是使用Vue、Spring Boot和FFmpeg实现视频分片上传的大致流程: 1. 前端使用Vue编写上传组件,将视频文件进行分片并上传到服务器。 2. 后端使用Spring Boot接收前端上传的视频分片,并将分片存储到服务器上。 3. 在所有分片上传完成后,后端使用FFmpeg将分片合并成一个完整的视频文件。 下面是具体实现步骤: 1. 安装vue-upload-component组件,在Vue组件中引入该组件。 2. 在Vue组件中编写上传方法,将视频文件进行分片并上传到服务器。分片的大小可以根据实际情况进行设置,一般为1MB ~ 2MB。 3. 在上传过程中,可以实现进度条、暂停上传、继续上传等功能,以提升用户体验。 1. 使用Spring Boot编写接收上传分片的接口,将分片存储到服务器上。可以使用Spring Boot提供的MultipartFile类来接收前端上传的文件。 2. 在接收到所有分片后,使用FFmpeg将分片合并成一个完整的视频文件。可以使用FFmpeg的命令行工具,也可以使用FFmpeg的Java API。 3. 合并完成后,可以将视频文件存储到服务器的指定路径下,或者将视频文件存储到云存储中。 综上所述,使用Vue、Spring Boot和FFmpeg实现视频分片上传可以有效地解决大文件上传过程中遇到的问题,提升用户体验,并且保证视频文件的完整性。