Android+FFmpeg+ANativeWindow视频解码播放
来源:互联网 发布:中国税务网络大学ios 编辑:程序博客网 时间:2024/04/30 06:27
http://blog.csdn.net/glouds/article/details/50937266
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
- 准备工作
- 编译FFmpeg
- 开发环境
- 建立videoplayer工程
- 建立AS工程
- 实现解码播放
- 运行结果
- 本例工程下载videoplayer
准备工作
1.编译FFmpeg
下载最新版的FFmpeg,具体编译步骤参考文章:FFmpeg的Android平台移植—编译篇。
对于FFmpeg不太了解的可以先阅读雷霄骅的FFmpeg博客专栏。
2.开发环境
Windows 10
Android Studio 1.4
android-ndk-r10d
FFmpeg 3.0
具体的环境配置这里不细讲,可参考Android Studio + NDK的环境配置。
建立videoplayer工程
本文章仅介绍视频播放部分,不包含音频播放,音频播放参见Android+FFmpeg+OpenSL ES音频解码播放。
1.建立AS工程
本文采用直接从SD卡中读取视频文件进行播放,因此在AndroidManifest.xml文件中添加权限:
- 1
- 1
Android的Java API中的GLSurfaceView和VideoView都是继承于SurfaceView的,因此本例中仅在content_main.xml中添加了一个SurfaceView控件:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
紧接着在MainActivity.Java中获取并操作该控件:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
下面将实现SurfaceHolder.Callback接口:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
视频播放为耗时操作,为了不阻塞UI线程,需要新建线程播放视频。VideoPlayer类的具体实现为:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在VideoPlayer类中需要加载动态库,并将play方法声明为本地方法。由于本例仅仅是一个简单的视频解码播放的例子,因此并未添加过多的方法。在play方法的参数中不能使用Surface类,因为这个类不是java类库中的,使用javah命令无法生成相应的头文件,因此需要使用Object基类。现在可以使用javah命令生成头文件:jonesx_videoplayer_VideoPlayer.h。
2.实现解码播放
首先按照文章FFmpeg的Android平台移植—编译篇中的步骤:
新建jni目录,并将编译好的FFmpeg目录中的include和prebuilt文件夹拷贝到jni目录下。
在VideoPlayer.c文件中实现视频的解码播放:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
至于stride的问题可以参见android ffmpeg bad video output。
现在需要编写Android.mk文件:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
由于没有用到device和filter库中的方法,因此并未连接这两个动态库。
Application.mk文件如下:
- 1
- 2
- 1
- 2
经过ndk-build之后,整个工程的主要目录结构如下图所示:
3.运行结果
为了使工程能够运行,还需要在build.gradle文件中添加一行代码:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
本例使用的Android设备是Google nexus 7,最终的测试结果如下图所示:
注意本例并不是一个真正的视频播放器,因为并没有添加音频播放,以及播放控制操作;也没有对视频的播放速度进行控制,每解码一帧就直接渲染到SurfaceView上。
本例工程下载:videoplayer。
- Android+FFmpeg+ANativeWindow视频解码播放
- Android+FFmpeg+ANativeWindow视频解码播放
- android :ffmpeg+anativewindow做视频播放
- ffmpeg解码视频及倒序播放
- 使用FFmpeg+GDI解码和播放视频
- ffmpeg编程基础:视频解码、音频播放
- 三、FFMPEG视频解码及播放
- ffmpeg视频解码以及opencv视频播放参考
- ffmpeg解码H.264视频数据,MFC播放视频
- VC++实现视频聊天:FFmpeg解码+SDL播放视频
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- Android 本地视频播放器开发 —— ffmpeg解码视频文件中的音频
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- android studio 2.2 cmake ffmpeg 简单的播放器(这里只有视频解码)
- Docker-创建本地的镜像和上传下载镜像
- 通过无线AP轻松突破内网准入控制
- Ruby 类与模块
- DNS报文格式
- IPSec IKE-ISAKMP-DH AH-ESP MD5-SHA1 DES-3DES-AES-RSA
- Android+FFmpeg+ANativeWindow视频解码播放
- RFC3261
- DEV 控件lookupedite 在WPF中使用
- SIP Authentication
- Introduction to the S/MIME Toolkit
- 使用sys.sp_testlinkedserver测试Linked Server连接是否正常
- 数字签名和数字证书
- Github简单入门操作指南(一)
- SIP timer