概述
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 \
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实现视频分片上传可以有效地解决大文件上传过程中遇到的问题,提升用户体验,并且保证视频文件的完整性。