在Bilibili/ijkplayer,里面增加librtmp。

基本都是照着https://github.com/yixia/FFmpeg-Vitamio写的。但是有些地方不一样了。

因为librtmp需要openssl的支持,所以使用ijk的init-android-openssl.shAndroid/contrib/compile-openssl.sh就可以编译成功,

在build/openssl-armv7a/output/lib下会生成两个.a静态库文件libcrypto.a和libssl.a。

接下来,编译librtmp

在android/contrib目录下

git clone git://git.ffmpeg.org/rtmpdump

下载librtmp。

在文件下建4个文件

Android.mk

AndroidManifest.xml

jni/Application.mk

librtmp/Android.mk

Android.mk中

--------------------------------------------------------------------

[plain]  view plain  copy
  1. <strong>LOCAL_PATH := $(call my-dir)  
  2.   
  3. subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \  
  4.         librtmp \  
  5.     ))  
  6. ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)  
  7. openssl=openssl-armv7a  
  8. else ifeq ($(TARGET_ARCH_ABI),x86)  
  9. openssl=openssl-x86  
  10. else ifeq ($(TARGET_ARCH_ABI),armeabi)  
  11. openssl=openssl-armv5  
  12. endif  
  13. SSL :=$(LOCAL_PATH)/../build/$(openssl)/output  
  14. ifndef SSL  
  15. $(error "You must define SSL before starting")  
  16. endif  
  17.   
  18. include $(subdirs)</strong>  
--------------------------------------------------------------------
AndroidManifest.xml随便拷贝一个

jni/Application.mk中,支持3中平台

--------------------------------------------------------------------

[plain]  view plain  copy
  1. NDK_TOOLCHAIN_VERSION := 4.8  
  2. APP_ABI := armeabi armeabi-v7a x86   
  3. APP_PROJECT_PATH := $(shell pwd)  
  4. APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk  

--------------------------------------------------------------------

librtmp/Android.mk中

--------------------------------------------------------------------

[java]  view plain  copy
  1. <strong>LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_C_INCLUDES += $(NDK_PROJECT_PATH)/librtmp \  
  4.     $(SSL)/include  
  5.   
  6. LOCAL_SRC_FILES:= \  
  7.     amf.c \  
  8.     hashswf.c \  
  9.     log.c \  
  10.     parseurl.c \  
  11.     rtmp.c  
  12.   
  13. LOCAL_CFLAGS += -I$(SSL)/include -DUSE_OPENSSL  
  14. LOCAL_LDLIBS += -L$(SSL)/lib  
  15. LOCAL_LDLIBS += -lssl -lcrypto -lz  
  16. LOCAL_MODULE := librtmp  
  17.   
  18. include $(BUILD_SHARED_LIBRARY)</strong>  

--------------------------------------------------------------------

执行ndk-build命令,进行编译。

然后就是要编译ffmpeg了。

修改tools下的do-compile-ffmpeg.sh文件

定义RTMPDUMP=$FF_BUILD_ROOT/librtmp

注意把FF_BUILD_ROOT=`pwd`放到他前面

在if [ "$FF_ARCH" = "armv7a" ]; then,elif [ "$FF_ARCH" = "armv5" ]; then,elif [ "$FF_ARCH" = "x86" ]; then里

修改FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -Wl,--fix-cortex-a8 -L$RTMPDUMP/libs/armeabi-v7a"

增加

[plain]  view plain  copy
  1. RTMP_OBJS=`find $RTMPDUMP/obj/local/armeabi-v7a/objs/rtmp -type f -name "*.o"`  
修改
[plain]  view plain  copy
  1. FF_ASM_OBJ_DIR="libavutil/arm/*.o libavcodec/arm/*.o libswresample/arm/*.o $RTMP_OBJS"  
[plain]  view plain  copy
  1. <pre name="code" class="plain">FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-protocol=librtmp*"  
  2. FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-librtmp"  
因为这3中平台支持openssl。
 
  

在FF_CFLAGS="-O3 -Wall -pipe \里增加

-I$RTMPDUMP -lrtmp"

FF_CFG_FLAGS增加

[plain]  view plain  copy
  1.   

修改ffmpeg-*/configure

[plain]  view plain  copy
  1. enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Init -L$RTMPDUMP/libs/armeabi-v7a -lrtmp  || die "ERROR: librtmp not found"; }  


然后使用compile-ffmpeg.sh就可以编译了。


以下是 Android 中使用 ijkplayer 的基本代码示例: 1. 在 build.gradle 文件中添加 ijkplayer 的依赖: ```groovy implementation 'tv.danmaku.ijk.media:ijkplayer-java:x.x.x' implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:x.x.x' implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:x.x.x' implementation 'tv.danmaku.ijk.media:ijkplayer-x86:x.x.x' implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:x.x.x' ``` 其中 `x.x.x` 是 ijkplayer 版本号,可以在 [https://github.com/bilibili/ijkplayer/releases](https://github.com/bilibili/ijkplayer/releases) 中查看最新版本号。 2. 在布局文件中添加 IjkVideoView 控件: ```xml <tv.danmaku.ijk.media.player.IjkVideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在 Activity 或 Fragment 中使用 IjkVideoView 播放视频: ```java public class VideoActivity extends AppCompatActivity { private IjkVideoView mVideoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video); mVideoView = findViewById(R.id.video_view); // 设置视频地址 mVideoView.setVideoPath("http://example.com/video.mp4"); // 开始播放 mVideoView.start(); } @Override protected void onStop() { super.onStop(); // 停止播放并释放资源 mVideoView.stopPlayback(); } } ``` 4. 可以设置 IjkMediaPlayer 的一些参数,例如: ```java IjkMediaPlayer mediaPlayer = new IjkMediaPlayer(); // 设置播放速度 mediaPlayer.setSpeed(1.5f); // 开启硬解码 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1); // 设置缓冲大小 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024 * 1024); // 设置超时时间 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 1000000); ``` 这些参数的具体含义可以参考官方文档:[https://github.com/bilibili/ijkplayer/blob/master/android/ijkplayer/ijkplayer-core/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java](https://github.com/bilibili/ijkplayer/blob/master/android/ijkplayer/ijkplayer-core/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值