今天调试公司用VideoView实现的播放器来播放视频的时候,只有声音输出而无画面输出。一开始以为是自己程序有问题,调试了半天无果。怀疑是真机本身的问题,于是下了几个第三方的播放器来进行视频播放,例如:快播、暴风影音、百度视频和MoboPlayer,都是无疾而终。这更加确定了是真机解码的问题。

我的解决方法是:

1、替换了libstagefright.so库文件,因为该文件被公司的底层人员修改过来适应公司的产品,因此每个公司的该文件可能不同。

adb push libstagefright.so /system/lib

2、然后再重启机器

adb reboot

=============================================================

更多关于libstagefright.so的介绍可以参考下文。http://blog.csdn.net/andyhuabing/article/details/7861648

而Android 的mediaplayer包含audio及video两部分的播放功能上,单独的音频或视频都是一个系统中的重要组成部分,另外一个就是显示系统部分在,在android系统最核心的就是SurfaceFlinger组件了。而音视频也同时存在核心部分:AndioFlinger及Stagefright(OpenCore)做具体的视频处理工作。

1、代码位置

   需要从代码阅读了解其设计思想,则必须知道其代码主要目录
JAVA类的路径:frameworks/base/media/java/android/media/MediaPlayer.java
JAVA本地调用部分(JNI):frameworks/base/media/jni/<p align="justify">android_media_MediaPlayer.cpp </p>
这部分内容编译成为目标是libmedia_jni.so。
主要的头文件在以下的目录中:frameworks/base/include/media/
多媒体底层库在以下的目录中:frameworks/base/media/libmedia/ 
这部分的内容被编译成库libmedia.so。
多媒体服务部分:frameworks/base/media/libmediaplayerservice/ 
文件为mediaplayerservice.h和mediaplayerservice.cpp 
这部分内容被编译成库libmediaplayerservice.so。

 2.2系统目录:
基于OpenCore的多媒体播放器部分 external/opencore/ 
这部分内容被编译成库libopencoreplayer.so。从程序规模上来看,libopencoreplayer.so是主要的实现部分,而其他的库基本上都是在其上建立的封装和为建立进程间通讯的机制。

2.3系统目录:
基于Statefright的多媒体播放器部分 frameworks\base\media\libstagefright
这部分内容被编译成库 libstagefright.so。从程序规模上来看,libstagefright.so是主要的实现部分,而其他的库基本上都是在其上建立的封装和为建立进程间通讯的机制。

=============================================================

由于编写的视频播放器最终都是调用系统的MediaPlayer来进行播放,而视频解码方式有软解码和硬解码两种方式,关于这两种编码方式看下文。

硬解码和软解码的区别

什么是“软解码”,什么又是“硬解码”呢?

  我们在计算机上播放的视频文件都是经过压缩的,因为这样有利于节约存储空间;那么在播放过程,就需要进行一个反射的解压缩过程。在以前这项工作都是由CPU来完成的,对于普通分辨率的AVI、RMVB等文件,绝大多数的CPU都可以胜任;但是发展到高清视频(1080i/p)之后,数据解压缩的工作量比以前翻了数倍,这让很多处理器叫苦不迭。

  随着技术的发展,工程师们发现显卡的GPU/VPU要比CPU更适合这类大数据量的、低难度的重复工作。视频解码工作从处理器那里分离出来,交给显卡去做,这就叫做“硬解码”,例如NVDIA的PureVideo、AMD的UVD技术等等;与之对应的,以前那种纯粹依靠CPU来讲稿的方式则是“软解码”。不过受到技术条件的限制,纯粹的“硬解码”在现阶段是不存在的,CPU依然在发挥一部分作用,只不过硬解码时GPU/VPU已经成为运算的主力。

☆硬解码都有哪些好处?

  很多使用老电脑的朋友都有这样的体会,播放高清视频时画面会卡得跳帧(就跟看幻灯片一样),声音也是断断续续的;但解码工作交给新显卡后,CPU就可以解放出来做更多的事情,与此同时还降低了整机功耗,风扇也不至于“呼呼”作响……

☆为什么现在又有很多人热衷于软解码呢?

  硬解码虽好,但是其中复杂的设置过程也只有少数发烧友才玩得转,很多入门用户面对复杂的设置选项就如同看天书一般,根本不知道如何下手。而且随着处理器恨不能的不断提升,现在就算是主流的双核产品,也能达到软解码的需求,在此基础上软解码又受到很多人的青睐。简单、易用是软解码最大的优势,而且在现阶段软解码在画质上要更好一些。

老鸟指点迷津

  “三十年河东,三十年河西”,以前我们很多人都认为硬解码要更好一些,但是现在我们建议是:对于那些仍在使用老机器,或者动手能力比较高的用户,推荐硬解码;反之,对于普通用户而言,如果你的机器性能已经足够,使用软解码也未尝不可,不用苛求一定要“玩硬的”。

  摘自《微型计算机》

=============================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

=============================================================

我的Android进阶之旅------>android视频播放只有声音无画面的解决办法的更多相关文章

  1. 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法

    我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...

  2. 我的Android进阶之旅------>Android中查看应用签名信息

    一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...

  3. 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  4. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  5. 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  6. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  7. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...

  8. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...

  9. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)

    对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游 ...

随机推荐

  1. Spring MVC通过Pageable对象和PageableDefault注解获取分页信息(MongoDB通过Pageable来操作分页)

    说明:Pageable同时也能用于操作MongoDB的分页. PageableSpring Data库中定义的一个接口,该接口是所有分页相关信息的一个抽象,通过该接口,我们可以得到和分页相关所有信息( ...

  2. dump_stack的简单使用

    转载:http://blog.csdn.net/sanchuyayun/article/details/39183941 刚刚接触内核,在调试过程中用printk打印信息当然是直接有效的办法,但当我们 ...

  3. Linux下Reids的安装和使用

    简单记录一下 redis的官网:https://redis.io/ 官网介绍: Installation Download, extract and compile Redis with: $ wge ...

  4. python:字符串的连接

    python中有很多字符串连接方式,今天在写代码,顺便总结一下: 最原始的字符串连接方式:str1 + str2 python 新字符串连接语法:str1, str2 奇怪的字符串方式:str1 st ...

  5. 应用程序之UITableView的编辑模式

    cell分层结构 效果展示 代码实现 一.cell的分层结构 二.效果展示 三.代码实现 // // ViewController.m // 01-TableView的删除实现 // // Creat ...

  6. Lua学习四----------Lua变量

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua变量 - 变量在使用前,必须在代码中进行声明,即创建该变量 - 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值 ...

  7. Laravel 5.4---后端数据分页和前端显示分页结果

    后端数据(Eloquent 模型)分页 事先建立好Eloquent 模型和Controller 还有 前台的View.可以参考我之前的文章:Laravel建站03--建立前台文章列表和文章详情 在co ...

  8. opencl教程

    http://www.altera.com.cn/corporate/news_room/releases/2013/products/nr-opencl-sdk-13.0.html http://w ...

  9. hashCode与equals的作用与区别及应当注意的细节

    最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的,所以决定把它们研究一下. 以前写程序一直没有注意hashCode的作用 ...

  10. Android----SharedPreferences(存储数据)

    SharedPreferences详解 我们在开发软件的时候,常需要向用户提供软件参数设置功能,例如我们常用的微信,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是在windo ...