在用SurfaceView播放视频时,如果处理不当,会出现有声音无图像的问题,主要的原因是,在调用MediaPlayer开始播放视频时,SurfaceView却还未创建成功,解决办法是判断SurfaceView创建成功后再调用MediaPlayer的播放,通过surfaceHolder的addCallBack()方法来监听surfaceCreated。
以下是2段源码,第1段有声音无图像,第2段有声音有图像
源码1:有声音无图像
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends Activity
private SurfaceView surfaceView = null ;
private SurfaceHolder surfaceHolder = null ;
private MediaPlayer mp = null ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
surfaceView = new SurfaceView(this);
在用SurfaceView播放视频时,如果处理不当,会出现有声音无图像的问题,主要的原因是,在调用MediaPlayer开始播放视频时,SurfaceView却还未创建成功,解决办法是判断SurfaceView创建成功后再调用MediaPlayer的播放,通过surfaceHolder的addCallBack()方法来监听surfaceCreated。 以下是2段源码,第1段有声音无图像,
使用VideoView播放视频简单、方便,但有些早期的开发者还是更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放的图像输出。
使用MediaPlayer播放视频的步骤如下:
Step1:创建MediaPlayer对象,并让它加载指定的视频文件;
Step2:在界面布局文件中定义SurfaceView控件,或在程序中创建SurfaceView控件,并为SurfaceView的SurfaceHolder添加Callback监听器;
Step3:调用MediaPlayer对象的setDisney(SurfaceHolder sh)方法将所播放的视频图像输出到指定的SurfaceView控制;
Step4:调用MediaPlayer的start()、stop()、pause()方法来控制视频播放。
android 播放视频时可能出现只有视频声音没有图像的现象,出现这种情况一般有一下几种可能:
1.视频本身问题。换个视频看看结果。
2.分辨率设置问题。holder.setFixedSize(width,heigh); 设置分辨率的方法应通过handler 在主线程设置。
3.没有设置MediaPlayer.setDisplay(SurfaceHolder
sh)方法,或设置位置错误,
<application
android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false&am
在使用uniapp的video组件的时候,遇到进入页面播放正常,但再次进入重新加载页面后,会出现黑屏但有声音的问题。
因为需求是要在离开页面后不再播放视频,所以这里在onShow时绑定视频组件,并开始播放:
<video id="myVideo" :src="videosrc" object-fit="cover" :autoplay="true" loop="true" controls="false" custom-cache="false" enable-play-gesture="false"
这个视频格式是flv,推流走的是rmtp,是这个
问题的解决我开始是直接百度了下,很多资料显示需要下载安装ubuntu后重新编译,感觉有点麻烦,找github上的issue,发现设置
android:hardwareAccelerated="true"
我理解您的问题是关于SurfaceView和SurfaceFlinger的区别和联系。
SurfaceView是Android提供的一个视图控件,它可以在一个独立的线程中绘制图形,而不会阻塞主线程。它通常用于需要高性能、流畅的图形绘制的场景,比如视频播放、游戏等。SurfaceView内部使用了Surface来管理图形缓冲区,这使得它可以更加高效地绘制图形。
SurfaceFlinger是Android系统中的一个系统服务,它负责管理屏幕显示。它从各个应用中收集图形数据,并将它们组合成最终的图像,然后再显示到屏幕上。SurfaceFlinger使用OpenGL ES来进行图形渲染,它支持硬件加速,可以提高图形渲染的性能。
在Android中,SurfaceView和SurfaceFlinger是紧密相关的。当一个应用使用SurfaceView进行图形绘制时,SurfaceView内部会创建一个Surface,然后将它交给SurfaceFlinger来进行显示。SurfaceView通过SurfaceHolder类来管理Surface的生命周期和状态,比如创建、销毁、显示等。SurfaceFlinger会根据SurfaceView传递过来的Surface信息,将对应的图像进行组合和渲染,最终显示到屏幕上。
总之,SurfaceView和SurfaceFlinger都是Android中用于图形处理和显示的重要组件。它们的结合使得Android应用能够更加高效地进行图形绘制和显示。