您当前的位置:首页 > 互联网教程

android多媒体开发,怎么改视频分辨率

发布时间:2025-05-13 03:27:01    发布人:远客网络

android多媒体开发,怎么改视频分辨率

一、android多媒体开发,怎么改视频分辨率

如果你的问题是指修改视频的分辨率,那么通常需要在多媒体框架中处理。在Android平台上,可以通过MediaCodec或MediaMuxer等API来调整视频分辨率。具体来说,你可以使用MediaCodec对视频进行解码,然后在解码过程中调整分辨率,最后重新编码输出。

在Android开发中,如果你的目标是修改视频分辨率,你需要深入理解视频编码和解码的过程。MediaCodec提供了对H.264、HEVC等格式的支持,可以用来调整视频分辨率。通常流程是先解码视频,然后通过调整像素数据来改变分辨率,最后再编码输出。

如果你的目标是调整播放窗口的大小,可以考虑在surfaceView里重写onMeasure方法,通过这种方式控制视频播放区域的大小。这种方法不会改变视频本身的分辨率,只是改变了显示的尺寸。

对于调整视频分辨率,你还可以考虑使用第三方库,比如ExoPlayer,它提供了更丰富的功能,包括视频处理能力。ExoPlayer内置了多种媒体处理模块,可以方便地调整视频的分辨率和其他参数。

另外,调整视频分辨率可能会涉及到性能问题,特别是在移动设备上。因此,在实际应用中,你需要权衡调整分辨率带来的好处和性能开销。在高分辨率视频处理时,确保你的设备和应用有足够强大的硬件支持,以避免卡顿或性能下降。

总之,调整视频分辨率在Android多媒体开发中是一个常见的需求,可以通过多种方式实现,包括直接在代码中处理视频数据流,利用框架提供的API,或者使用第三方库来简化开发过程。

二、Android开发权威指南的图书目录

第1章初识庐山真面目——Android开发简介2

第2章工欲善其事,必先利其器——搭建和使用Android开发环境9

2.1.1开发Android程序都需要些什么9

2.1.2安装JDK和配置Java开发环境10

2.2真实体验——编写第一个Android程序(随机绘制圆饼)15

2.2.2在模拟器中运行Android程序17

2.3迁移Android工程可能发生的错误29

2.4不需要写一行代码的开发工具:AppInventor31

2.4.2AppIntentor的下载和安装31

2.4.3用拖曳控件的方式设计界面33

第3章千里之行始于足下——Android程序设计基础40

3.1.2AndroidManifest.xml文件的结构42

3.3.1Activity(Android的窗体)45

3.3.3Broadcast Receiver(广播接收器)45

3.3.4Content Provider(内容提供者)46

3.4.2ADT自带的可视化UI设计器47

3.4.3使用DroidDraw设计UI布局47

第4章我的UI我做主——用户界面开发基础49

4.1.3显示其他的Activity(Intent与Activity)52

4.3在不同Activity之间传递数据60

4.3.5返回数据到前一个Activity67

4.4.2使用XML布局文件定义视图69

4.5.3相对布局(RelativeLayout)79

4.5.5绝对布局(AbsoluteLayout)82

第5章良好的学习开端——控件(Widget)详解88

5.1.2控件的宽度(android:layout_width)和高度(android:layout_height)88

5.1.3android:layout_margin属性89

5.1.5android:layout_weight属性90

5.1.6android:layout_gravity和android:gravity属性90

5.1.9指定单击事件方法(android:onClick属性)92

5.1.10控件焦点属性(android:focusable和android:focusable-InTouchMode)92

5.2.1显示富文本(URL、不同大小、字体、颜色的文本)93

5.2.2在TextView中显示表情图像和文字97

5.2.7在未显示完的文本后面加省略号(…)111

5.2.8用TextView实现走马灯效果113

5.2.9垂直滚动TextView中的文本114

5.3EditText(编辑文本的控件)115

5.3.2在EditText中输入特定的字符117

5.3.3AutoCompleteText-View(自动完成输入内容的控件)118

5.4.3ImageButton(图像按钮控件)124

5.4.4RadioButton(选项按钮控件)124

5.4.5ToggleButton(开关状态按钮控件)125

5.5ImageView(显示图像的控件)128

5.5.1ImageView控件的基本用法128

5.6.1DatePicker(输入日期的控件)133

5.6.2TimePicker(输入时间的控件)134

5.6.3DatePicker、TimePicker与TextView同步显示日期和时间134

5.6.4AnalogClock和DigitalClock(显示时钟的控件)136

5.7.1ProgressBar(进度条控件)137

5.7.3设置ProgressBar和SeekBar的颜色及背景图140

5.8.1ListView(普通列表控件)145

5.8.2为ListView列表项添加复选框和选项按钮147

5.8.3对列表项进行增、删、改操作149

5.8.5ListActivity(封装ListView的Activity)154

5.8.6ExpandableListView(可扩展的列表控件)155

5.9.1ScrollView(垂直滚动控件)160

5.9.2HorizontalScrollView(水平滚动控件)161

5.9.3可垂直和水平滚动的视图162

5.10ImageSwitcher(图像切换控件)164

第6章友好的菜单——Menu介绍与实例172

6.1.1创建选项菜单(Options Menu)172

6.1.5动态添加、修改和删除选项菜单175

6.1.6带复选框和选项按钮的子菜单176

6.2.3QuickContactBadge与联系人菜单189

第7章友好地互动交流——信息提醒(对话框、Toast与Notification)193

7.1.1带2个按钮(确认/取消)的对话框193

7.1.2带3个按钮(覆盖/忽略/取消)的对话框195

7.1.8使用Activity托管对话框207

7.2.1阻止单击按钮关闭对话框209

7.2.3在对话框按钮和内容文本中插入图像215

7.3.3用PopupWindow模拟Toast提示信息框221

7.4.1在状态栏上显示通知信息222

7.4.2Notification的清除动作224

7.4.3永久存在的Notification225

第8章移动的信息仓库——数据存储228

8.1读写key-value对:SharedPreferences228

8.1.1SharedPreferences的基本用法228

8.1.4设置数据文件的访问权限233

8.1.5可以保存设置的Activity:PreferenceActivity234

8.2.1openFileOutput和openFileInput方法238

8.2.3SAX引擎读取XML文件的原理241

8.2.4将XML文件转换成Java对象242

8.3.2SQLiteOpenHelper类与自动升级数据库251

8.3.3数据绑定与SimpleCursorAdapter类252

8.3.5将数据库与应用程序一起发布256

第9章Android中的窗口——Activity259

9.1调用其他程序中的Activity259

9.1.5向E-mail客户端传递E-mail地址261

9.1.8显示系统设置界面(设置主界面、Wifi设置界面)263

9.3.3Activity之间切换的动画效果269

第10章全局事件——广播(Broadcast)271

10.2.7显示手机电池的当前电量282

第11章跨应用数据源——Content Provider287

11.3.2为Content Provider添加访问权限297

第12章一切为用户服务——Service基础与实例299

12.1.2绑定Activity和Service302

12.1.4判断Service是否已注册306

12.1.5判断Service是否已开始307

12.2.4传递复杂数据的AIDL服务312

第13章做好应用桥梁——网络与通信320

13.1.1用WebView控件浏览网页320

13.1.2用WebView控件装载HTML代码322

13.2.1提交HTTP GET和HTTP POST请求324

13.3.4获得无线路由分配给手机的IP地址334

13.4.2利用Socket在应用程序之间通信340

第14章炫酷你的应用——多媒体开发352

14.2.1使用VideoView播放视频354

14.2.2使用SurfaceView播放视频355

15.1.2在SurfaceView上实现动画效果371

15.4.1AnimationDrawable与帧动画392

16.1.2加速度传感器(Accelerometer)409

16.1.5陀螺仪传感器(Gyroscope)411

16.1.6方向传感器(Orientation)411

16.5.1窗口小部件(AppWidget)425

17.4.2检测浏览器是否支持Canvas449

17.4.3在Web页面中使用Canvas450

第19章Android OpenGL ES开发基础469

20.2左右摇摆的Android机器人482

21.2安装、配置和测试NDK开发环境495

21.2.2下载和安装Android NDK495

21.2.4配置Android NDK的开发环境498

21.3第一个NDK程序:世界你好499

21.3.2用命令行方式编译NDK程序501

21.3.3在Eclipse中集成Android NDK502

21.4背景不断变化的三角形(NDK版OpenGL ES)504

21.5使用NDK OpenGL ES API实现千变万化的3D效果507

21.7本地Activity(Native Activity)511

21.8Android NDK配置文件详解513

21.8.1Android NDK定义的变量513

21.8.2Android NDK定义的函数514

21.8.4配置Application mk文件516

第23章Android综合案例一——蓝牙聊天528

23.4使设备可被其他蓝牙设备发现533

第24章Android综合案例二——月球登陆(游戏)538

第25章Android综合案例三——全键盘输入法(应用)547

25.4根据EditText控件的属性显示不同的软键盘551

第26章Android综合案例四——贪吃蛇(游戏)554

第27章Android综合案例五——新浪微博客户端(应用)561

27.3创建和配置新浪微博客户端工程564

第28章Android综合案例六——笑脸连连看(游戏)577

三、Android怎样监听蓝牙耳机的按键事件

其实对于Android系统,每次按键只会有一个唯一「键值」响应,使用起来感觉会模模糊糊的,但是其实对于系统来说是很清晰的。

AVRCP全称(Audio/VideoRemoteControlProfile),是蓝牙协议中的一个profile。从名字上就可以看出主要应用于Audio/Video控制。每个按键并不是独立的,上-曲/下一曲是在正在播放音乐的时候才会有效,即才会向Android发送「键值」。

基于按键从Linux到Android分析具体对于的键值:

Linux扫描码功能映射字串Android键值

00c8200开始放音乐MEDIA_PLAYKEYCODE_MEDIA_PLAY

00c9201停止放音乐MEDIA_PAUSEKEYCODE_MEDIA_PAUSE

00a3163下一曲MEDIA_NEXTKEYCODE_MEDIA_NEXT

00a5165上-曲MEDIA_PREVIOUSKEYCODE_MEDIA_PREVIOUS

Android应用代码,完整测试应用:TeskKey。

总结:1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE;2/3号键会在播放音乐时分别发送KEYCODE_MEDIA_PREVIOUS/.KEYCODE_MEDIA_NEXT。如果想要把蓝牙耳机上的按键利用起来,可以在接收到KEYCODE_MEDIA_PLAY时播放无声音乐以使能2/3号键。这样就能完整接收3种键值了自行控制了。这个具体自行设计(测试代码已经更新包含了)。

注:这种实现并不一定通用,比如我在深度定制的MIUI中测试,尽管启动的TestKey应用,系统自带的音乐播放器仍然能同时响应键值。

已经更新TestKey源码,添加对蓝牙耳机按键的监听,实现方法就是上述中推测的方法,已经成功验证过了。播放音乐参考《Android多媒体开发--资源文件播放》。效果图:

需要说明一点的是,程序带了两个音乐文件在/res/raw中,默认播放的是lapple.mp3一个有声音的mp3音乐文件,silence10sec.mp3是一个无声音的10秒钟音乐文件,实际应用中可以使用它。

1.这个只能在播放音乐的状态下才能监听到么?

答:根据上述的原理,这些按键也仅仅是应用在控制媒体时使用;且根据实际验证没有播放音乐时蓝牙耳机的2/3号键是并没有向Android设备发送键值(从底层Linux来看)。综上所述,需要通过播放音乐来实现激活其向Android设备发送键值,针对这种情况可以播放一个「没有声音」的音乐文件来实现,这样既可以监听到2/3号键又可以不影响其它声音的输出。可以在前台时播放音乐,后台停止播放。

2.我现在主要是想监听得到开关键(1号键)。在做一个按下蓝牙开关键后启动一个语音识别的功能?

答:在我的测试条件下,1号键是可以正常监听到的。1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE键值。这个键不需要模拟播放音乐就可以正常的监听到。

答:所谓的4号按键,也就是指本文中的所测试型号的蓝牙耳机上并没有,但有可能其它型号的蓝牙耳机上有。我没有办法测试验证,所以这里就简单叙述一下「新按键」的键值确定思路:1.先使用TestKey测试应用测试按键,测试Android上层是否可以得到对应键值。2.如果没有得到,那么就使用adbshellgetevent来看Linux底层可以不可以得到键值。然后根据按键从Linux到Android来确定Android上层使用的键值码到底是多少。(当然,如果你实在不知道如何监听,把蓝牙耳机寄给我,我给你确定也行。:))

注:其实上述文章完全是根据按键从Linux到Android测试确定下来的。那是篇文章是剥开Android外壳来看「按键」事件的流程的,方法适用于所有输入事件:各种按键/触摸/物理键盘/鼠标等待输入设备。没有一定的Linux开发经验很难看懂和理解。

或:如何启动一次应用后在后台一直监听播放键因为有这样一个场景在用户开车的时候需按一下开关键就启动语音识别的功能。

这个问题其实已经超出了本文讨论的范围,是Android系统对应用层的键盘事件(按键)的分发的问题了。正常情况下,按键只会向当前最端的应用分发键盘事件,也就是说在后台你边音量键都监听不了。

但是既然这种情况(后台应用监听按键)的需求存在,那么就一定有它存在的道理。比如「相机键」,按下后直接调出相机到最前台。从表面上看是相机响应了按键,但是从实现方法上来看,并不是通过键值来操作,必须通过其它方法,比如广播或者其它等等。

明白了其中的道理后,那么想要实现就好办了。先看这个按键有没有广播,如要有接听系统中发出来的广播;如果没有那么对于定制系统可以自己在系统中添加一个广播;总之,正常渠道是没有办法在后台监听一些不应该是你监听到的按键的。

更:查了一下,这个按键是有广播的。这样就可以后台响应了(不需要C/不需要root)。例子我就不试了,见Android官方例子RandomMusicPlayer。

其中的重点是这个广播android.intent.action.MEDIA_BUTTON。