前些时间,通过各种搜索加请教了好几个同行的朋友,在他们的指点下实现:
RTSP+H264实时视频播放播放及把实时视频流保存到手机SD卡中,再对保存的H264格式文件进行播放等基本功能。
非常感谢这些朋友的无私帮忙,在实现功能的同时,我也把他们提供的一些代码加自己的修改简单记录下来,希望能给有需要的朋友一点点帮助。
这篇博客就是简单记录用MediaCodec +SurfaceView解码播放本地H264文件。MediaCodec硬解码实现RTSP+H264实时视频播放完整功能可以参考:
https://github.com/ldm520/ANDROID_MEDIACODEC_RTSP_H264
public class ParseH264FileActivity extends Activity {
private SurfaceView mSurface = null;
private SurfaceHolder mSurfaceHolder;
private Thread mDecodeThread;
private MediaCodec mCodec;
private boolean mStopFlag = false;
private DataInputStream mInputStream;
private String FileName = "test.h264";
private int Video_Width = 1920;
private int Video_Height = 1080;
private int FrameRate = 15;
private Boolean isUsePpsAndSps = false;
private String filePath = Environment.getExternalStorageDirectory() + "/" + FileName;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Toast.makeText(ParseH264FileActivity.this, "播放结束!", Toast.LENGTH_LONG).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//保持屏幕常亮
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
File f = new File(filePath);
if (null == f || !f.exists() || f.length() == 0) {
Toast.makeText(this, "指定文件不存在", Toast.LENGTH_LONG).show();
return;
}
try {
//获取文件输入流
mInputStream = new DataInputStream(new FileInputStream(new File(filePath)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mSurface = (SurfaceView) findViewById(R.i