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

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

     

      今天调试公司用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

=============================================================
相关文章
|
2月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
59 7
|
7月前
|
API Android开发
Android高手进阶教程(十五)之---通过Location获取Address的使用!
Android高手进阶教程(十五)之---通过Location获取Address的使用!
68 1
|
3月前
|
Android开发
Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
本文介绍了 Android 平台上的 SurfaceView,这是一种高效的图形渲染控件,尤其适用于视频播放、游戏和图形动画等场景。文章详细解释了其双缓冲机制,该机制通过前后缓冲区交换来减少图像闪烁,提升视觉体验。然而,SurfaceView 与普通 View 叠加时可能存在 Z-Order 不一致、同步问题及混合渲染难题。文中提供了使用 TextureView、调整 Z-Order 和创建自定义组合控件等多种解决方案。
154 9
|
3月前
|
安全 API 开发工具
Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换
Android平台扬声器播放声音的采集,在无纸化同屏等场景下,意义很大,早期低版本的Android设备,是没法直接采集扬声器audio的(从Android 10开始支持),所以,如果需要采集扬声器audio,需要先做系统版本判断,添加相应的权限。
|
6月前
|
Android开发
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
1428 1
|
6月前
|
监控 Android开发 数据安全/隐私保护
安卓kotlin JetPack Compose 实现摄像头监控画面变化并录制视频
在这个示例中,开发者正在使用Kotlin和Jetpack Compose构建一个Android应用程序,该程序 能够通过手机后置主摄像头录制视频、检测画面差异、实时预览并将视频上传至FTP服务器的Android应用
|
6月前
|
Android开发 Windows
android studio开发时提示 TLS 握手错误解决办法
在Windows环境下遇到TLS协议版本不支持的错误,Gradle构建失败。解决方案是在build.gradle.kts中设置系统属性`https.protocols`为`TLSv1.2`,而非遵循误导信息设置为TLSv1.1。
|
6月前
|
存储 算法 Java
Android 进阶——代码插桩必知必会&ASM7字节码操作
Android 进阶——代码插桩必知必会&ASM7字节码操作
254 0
|
7月前
|
缓存 网络协议 Java
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
|
7月前
|
算法 安全 Java
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)