
视频播放器
文章平均质量分 56
we1less
学习
展开
-
[FFmpeg + OpenGL + OpenSL ES] OpenGL 渲染MediaCodec解码数据- 12
在项目raw下创建fragment_mediacodec.glsl 用来渲染视频#extension GL_OES_EGL_image_external : requireprecision mediump float;varying vec2 v_texPosition;uniform samplerExternalOES sTexture;void main() { gl_FragColor=texture2D(sTexture, v_texPosition);}Wl...原创 2020-11-15 11:21:40 · 414 阅读 · 0 评论 -
[FFmpeg + OpenGL + OpenSL ES] MediaCodec 硬解码 AVPacket- 11 硬解码
初始化MediaCodec:解码器类型(mime)例 "video/avc“,视频宽度(width),视频高度(height),最大数据输入大小(max_input_size),csd-0 头信息,csd-1 头信息。mediaFormat = MediaFormat.createVideoFormat(mime, width, height);mediaFormat.setInteger(MediaFormat.KEY_WIDTH, width);mediaFormat.setIntege.原创 2020-11-15 00:42:09 · 698 阅读 · 0 评论 -
[FFmpeg + OpenGL + OpenSL ES] AVPacket添加接码头信息- 10
AVPacket添加解码头信息 FFmpeg解码获得的AVPacket只包含视频压缩数据,并没有包含相关的解码信息(比如:h264的sps pps头信息,AAC的adts头信息),没有这些编码头信息解码器(MediaCodec)是识别不到不能解码的。在FFmpeg中,这些头信息是保存在解码器上下文(AVCodecContext)的extradata中的,所以我们需要为每一种格式的视频添加相应的解码头信息,这样解码器(MediaCodec)才能正确解析每一个AVPacket里的视频数据。使用AV..原创 2020-11-14 22:33:20 · 646 阅读 · 1 评论 -
[FFmpeg + OpenGL + OpenSL ES]判断是否支持mediaCodec硬解码- 9
解码流程:根据FFmpeg中视频解码器的名称找到对应手机硬解码器,如果存在则可以硬解码,走硬解码流程;不存在就只能走软解码流程。硬解码:使用MediaCodec直接解码AVpacket,此时需要对AVPacket进行格式过滤,然后MediaCodec解码后的数据用OpenGL ES渲染出来。检测视频是否能被硬解码: FFmpeg视频解码器名称获取 "h264“ 对应解码器 "video/avc“((const AVCodec*)(video->avCodec...原创 2020-11-14 20:06:31 · 466 阅读 · 0 评论 -
[FFmpeg + OpenGL + OpenSL ES]音视频同步- 8
音视频同步实现理论PTS和time_basePTS即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。time_base即时间度量单位(时间基),可以类比:米、千克这种单位。分别获取音频和视频的PTS(播放时间戳):PTS = avFrame->pts * av_q2d(avStream->time_base);获取音视频PTS差值,根据差值来设置视频的睡眠时间达到和音频的相对同步。视频快了就休眠久点,视频慢了就休眠少点,来达到同步。在 Video...原创 2020-11-10 23:57:22 · 863 阅读 · 0 评论 -
[FFmpeg + OpenGL + OpenSL ES]OpenGL ES 渲染获取到的yuv数据 - 7
OpenGL中是不能直接渲染YUV数据的,可以用3个纹理来分别获取Y、U和V的值,然后根据公式:r = y + 1.403 * v;g = y - 0.344 * u - 0.714 * v;b = y + 1.770 * u;转为rgb颜色格式显示出来。这个转换过程是在GPU中完成的,计算效率比在CPU中计算高很多倍在工程目录res目录下新建 raw文件夹 新建 顶点着色器/片元着色器vertex_shader.glslaattribute vec4 av_Po...原创 2020-11-10 22:48:50 · 284 阅读 · 0 评论 -
[FFmpeg + OpenGL + OpenSL ES]OpenGL ES 解码avFrame分离YUV数据分量 回调至java层 - 6
YUV420YUV420是指:Y : UV = 4 : 1YUV420PYUV420P是指:YUV的排列方式,先将Y排列完,再将U排列完,最后将V排列完。如:YYYYYYYYYYYYYYYY UUUU VVVVFFmpeg解码出来的视频YUV数据是存储在AVFrame中的data里面,以YUV420P为视频数据给OPenGL渲染。Y分量:frame->data[0]U分量:frame->data[1]V分量:frame->data[2]绝大多数视频都是YUV原创 2020-11-08 12:47:52 · 628 阅读 · 0 评论 -
[FFmpeg + OpenGL + OpenSL ES]OpenGL ES绘制三角形 - 4 ShaderUtil 工具类
绘制坐标范围:在 WlRender 类中声明顶点坐标数组 绘制坐标范围private final float[] vertexData = { -1.0f, 0f, 0f, 1f, 1f, 0f };为坐标分配本地内存地址在 WlRender 类中声明成员变量 private FloatBuffer verTexBuffer; 并且在构造器...原创 2020-11-08 01:39:54 · 238 阅读 · 0 评论 -
[FFmpeg + OpenGL + OpenSL ES]OpenGL ES初步 - 3
第一步: 继承GLSurfaceView第二步: 实现接口GLSurfaceView.Renderer{ void onSurfaceCreated(GL10 gl, EGLConfig config); void onSurfaceChanged(GL10 gl, int width, int height); void onDrawFrame(GL10 gl);}第三步: 编写glsl脚本(render)新建 ...原创 2020-11-08 00:19:27 · 1880 阅读 · 4 评论 -
[FFmpeg + OpenGL + OpenSL ES]获取视频AVFrame 并且释放相关资源 - 2
从队列中的AVPacket解码出AVFrame的相关函数:步骤一:AVPacket *avPacket = av_packet_alloc(); queue->getAvpacket(avPacket); avcodec_send_packet(avCodecContext, avPacket);步骤二:AVFrame *avFrame = av_frame_alloc(); avcodec_receiv...原创 2020-11-07 23:43:25 · 8118 阅读 · 3 评论 -
[FFmpeg + OpenGL + OpenSL ES]获取视频流avPacket - 1
首先创建video的c++类video.h在本类中声明一个线程thread_play 利用此线程获取队列里面的数据声明一个void play(); 来启动线程#ifndef MYMUSIC_WLVIDEO_H#define MYMUSIC_WLVIDEO_H#include "WlQueue.h"#include "WlCallJava.h"extern "C"{#include <libavcodec/avcodec.h>};...原创 2020-11-07 22:28:22 · 425 阅读 · 0 评论