视频播放相关内容总结

Android进阶:十、自定义视频播放器-1 如果开发人员不对SurfaceHolder进行维护,会出现最小化程序后,再打开应用的时候,视频的声音在继续播放,但是不显示画面了的情况,这就是因为当SurfaceView不被用户可见的时候,之前的SurfaceHolder已经被销毁了,再次进入的时候,界面上的SurfaceHolder已经是新的SurfaceHolder了。和SurfaceView不同的是,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。 阅读详情

视频播放相关内容总结

多媒体常识:

  • 什么是多媒体

    多媒体是计算机和视频技术的结合,实际上它是两个媒体;声音和图像,或者用现在的术语:音响和电视

  • 常用的视频格式

    Android系统默认:mp4、3gp
    常用格式:ts、3gpp、3g2、3gpp2、avi、mkv、flv、divx、f4v、rm、rmvb、rv、wmv、asf、mov、mpg、v8、ram、mpeg、
    swf、m2v、asx、ra、ram、ndivx、xvid等

  • 常用音频格式:

    Android系统:mp3、ogg;
    常用格式:wma、mid、m4a、xmf、aac、mpa、midi、ar等

  • 常用图片格式:PNG、GIF、BMP、jpg

  • 国内各个视频网站采用的解码框架:

    • 优酷、搜狐、奇艺、pps、暴风影音土豆、56网都是用的ffmpeg.
    • pptv已经使用p2p技术
      点对点技术(peer-to-peer, 简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,
      而不是把依赖都聚集在较少的几台服务器上。P2P网络通常用于通过Ad Hoc连接来连接节点。这类网络可以用于多种用途,
      各种档案分享软件已经得到了广泛的使用。P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中。

目前常用的开发框架:

  • VLC框架:
    VLC是一个开源项目,基于ffmpeg框架的自定义播放器。其中LibVLC是VLC的核心部分,就相当于MediaPlayer类
    VLC一个最主要的部分,它可以播放各种类型的媒体文件和流媒体文件,并且可以创造媒体流并保存成各种格式的媒体文件
    VLC是一种跨平台的媒体播放器和流媒体服务器,最初为videolan的客户端,它是一种非常简便的多媒体播放器,
    它可以用来播放各种各样的音视频的格式文件(MPEG-1、MPEG-2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC等等)流媒体协议
    最具特色的功能是可以边下载边观看Divx媒体文件,并可以播放不完全的AVI文件。并且支持界面的更改。
    缺点:有C/C++代码,还有Java代码,代码太庞大

  • ffmpeg框架:
    优点:轻量级框架,易于维护
    FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案
    FFMPEG几乎为你把所有的繁重工作都做了,比如解码、编码、复用和解复用。
    这使得多媒体应用程序变得容易编写。它是一个简单的,用C编写的,快速的并且能够解码几乎所有你能用到的格式,当然也包括编码多种格式。
    FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多种编码,支持AVI、MPEG、OGG、Matroska、ASF等90多种解码
    FFmpeg主目录下主要有libavcodec、libavformat和libavutil等子目录。其中libavcodec用于存放各个encode/decode模块
    libavformat用于存放muxer/demuxer模块,libavutil用于存放内存操作等辅助性模块

  • vitamio框架:
    vitamio也是基于ffmpeg开源框架
    VPlayer是vitamio的一个产品,vitamio和VPlayer是同一个团队开发的,VPlayer能播放的vitamio也能播放

Surface简介

  • Surface就是“表面”的意思。在SDK的文档中,对Surface的描述是这样的:“Handle onto a raw buffer that is being managed by the screen compositor”,
    翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
    • 通过Surface(因为Surface是句柄)就可以获得原生缓冲器以及其中的内容。就像在C语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
    • 原生缓冲器(rawbuffer)是用于保存当前窗口的像素数据的。
  • 简单的说Surface对应了一块屏幕缓冲区,每个Window对应一个Surface,任何View都是画在Surface上的,传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行
  • 我们不能直接操作Surface实例,要通过SurfaceHolder,在SurfaceView中可以通过getHolder()方法获取到SurfaceHolder实例。
  • Surface是一个用来画图形的地方,但是我们知道画图都是在一个Canvas对象上面进行的,*Surface中的Canvas成员,是专门用于提供画图的地方,就像黑板一样,其中的原始缓冲区是用来保存数据的地方,
    Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原始缓冲区以及其他方面的内容,所以简单的说Surface是用来管理数据的(句柄)*。

SurfaceView简介

  • 简单的说SurfaceView就是一个有Surface的View里面内嵌了一个专门用于绘制的Surface,SurfaceView控制这个Surface的格式和尺寸以及绘制位置.SurfaceView是一个View也许不够严谨,
    然而从定义中 public class SurfaceView extends View显示SurfaceView确实是派生自View,但是SurfaceView却有着自己的Surface,源码:

    if (mWindow == null) {  
        mWindow = new MyWindow(this);  
        mLayout.type = mWindowType;  
        mLayout.gravity = Gravity.LEFT|Gravity.TOP;  
        mSession.addWithoutInputChannel(mWindow, mWindow.mSeq, mLayout,  
        mVisible ? VISIBLE : GONE, mContentInsets);  
    }  

    很明显,每个SurfaceView创建的时候都会创建一个MyWindow,new MyWindow(this)中的this正是SurfaceView自身,因此将SurfaceView和window绑定在一起,而前面提到过每个window对应一个Surface,
    所以SurfaceView也就内嵌了一个自己的Surface,可以认为SurfaceView是来控制Surface的位置和尺寸。传统View及其派生类的更新只能在UI线程,然而UI线程还同时处理其他交互逻辑,
    这就无法保证view更新的速度和帧率了,而SurfaceView可以用独立的线程来进行绘制,因此可以提供更高的帧率,例如游戏,摄像头取景等场景就比较适合用SurfaceView来实现。

  • Surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。

  • Surfaceview提供了一个可见区域,只有在这个可见区域内的Surface部分内容才可见,可见区域外的部分不可见,所以可以认为SurfaceView就是展示Surface中数据的地方,Surface就是管理数据的地方,
    SurfaceView就是展示数据的地方,只有通过SurfaceView才能展现Surface中的数据。
    image
  • Surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者Surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。
    注意,如果Surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。
    这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
    SurfaceView的核心在于提供了两个线程:UI线程和渲染线程,两个线程通过“双缓冲”机制来达到高效的界面适时更新。

SurfaceHolder简介

显示一个Surface的抽象接口,使你可以控制Surface的大小和格式以及在Surface上编辑像素,和监视Surace的改变。这个接口通常通过SurfaceView类实现。
简单的说就是我们无法直接操作Surface只能通过SurfaceHolder这个接口来获取和操作Surface。
SurfaceHolder中提供了一些lockCanvas()`:获取一个Canvas对象,并锁定之。所得到的Canvas对象,其实就是Surface中一个成员。加锁的目的其实就是为了在绘制的过程中,
Surface中的数据不会被改变。lockCanvas是为了防止同一时刻多个线程对同一canvas写入。

*从设计模式的角度来看,Surface、SurfaceView、SurfaceHolder实质上就是MVC(Model-View-Controller),Model就是模型或者说是数据模型,更简单的可以理解成数据,在这里也就是Surface,
View就是视图,代表用户交互界面,这里就是SurfaceView,SurfaceHolder就是Controller.*

MediaController

  • MediaController继承FrameLayout,通过MediaPlayerControl接口与VideoView进行结合控制,内部是通过PopupWindow将整个控制栏界面显示到界面上,
    而该PopupWindow所显示在的位置就是通过setAnchorView()设置进来的Anchor一般可以使当前的VideoView或者是整个Activity的根布局。这里要分为小屏和全屏两种情况来进行设置。
    如果当前的MediaController只是播放前下面的控制栏部分(进度条、快进、快退、暂停等)这样我们可以通过对VideoView设置点击事件,控制它的显示和隐藏。
    如果MediaController为整个屏幕包括了控制栏部分、上端的信息显示部分、以及左右栏的功能部分、这时候就可以通过对MediaController本身设置点击事件来控制显示和隐藏。

Controller可以用PopupWindow来实现,具体有两种方式:

- 整个控制栏(上面的信息部分、下面的控制部分以及左右边)都在`Controller`中,`setAnchorView()`的时候就会让`Controller`中的`PopupWindow`显示出来(一直显示,但是这个`PopupWindow`是透明的),
    真正的显示与隐藏是控制在`PopupWindow`中的`View`部分的显示与隐藏来实现。开始的时候我是想用这种方式,当时我想的是播放就播放、控制就控制,分离开来多好,但是没想到,
    一旦有`PopupWindow`显示出来后,Activity是接收不到任何`Touch`事件的,所有的重试界面等都要放到`Controller`中实现(手势处理等)。但是也有好处,就是不管显示还是隐藏都可以去处理手势.

- `PopupWindow`不是全屏的,只包含下面真正的控制部分(快进、快退、暂停等,不包含上面的信息部分和左右边),而且也不是开始就显示,显示隐藏是通过控制`PopupWindow`的显示与隐藏来进行的。
    而对于信息部分、以及左右边都是在`Activity`的布局当中,我们通过接口回调得到`PopupWindow`的显示与隐藏来控制这些布局的显示与隐藏即可。
    这样的话我们就需要将手势等全部放到`Activity`中去处理,但是也有一个问题,就是如果`Controller`正在显示的话`Activity`是接收不到`Touch`事件的,就无法处理手势,只能是让`Controller`消失后才能处理手势。

  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
微信小程序视频播放 video 微信开发文档 <view class="banner" wx:if="{{list.is_buy!=1}}">//is_buy是否已购买 <image src="{{list.bimg}}"></image> <image bindtap="menu_on" src="../../resource/video.png"></image> </view> <video 阅读详情

相关推荐

Unity实现视频播放功能,制作视频播放器

这个是FrameWork框架中的,如果后面有时间我会尝试着将核心的与视频播放有关的代码拆分出来。上面三个脚本中前两个只需要放在Assets里就可以了,第二个需要作为组件挂载到游戏物体上。目前先发布相关脚本代码,后续会对内容进行补充。

WSFTSZ的博客 1126

前端视频播放技术概览

转眼间,2023 年已进入下半场,在这样一个时间节点下,长视频平台如爱奇艺、优酷、腾讯视频等,以及短视频平台如抖音、快手等,对大家来说早已是司空见惯的事物。然而,在我们追剧、刷弹幕的时候,很少有人会去深入思考这些平台背后的技术奥秘。直到最近,我需要在前端项目中实现视频播放时,我终于意识到,这些视频不仅在格式上存在着差异,甚至连播放形式都各有不同。举个例子,当下最为火热的 “”,通常是指实时的视频播放。相对应地,非实时的视频播放则被称为 “如果你有接触过,你或许还听说过 “” 这个词汇。

素履独行 | 元培的个人博客 2904

Flutter:基于video_player实现视频相关手势控制、全屏播放(2)

这里定义了三种读取视频的方式networkassetfile,分别对应网络视频工程视频本地视频文件Key key,@required String url, // 当前需要播放的地址this.width: double.infinity, // 播放器尺寸(大于等于视频播放区域)this.title = ‘’, // 视频需要显示的标题url = url,Key key,@required String dataSource, // 当前需要播放的地址。

2401_84408337的博客 925

播放文件内容程序

 [root@localhost]$ g++ playfile.cc -o playfile.outplayfile.cc#include#include#includeusing namespace std;//等待一秒void wait(){    long start=time(NULL);    while(time(NULL)==start

紫宸的专栏 460

深入理解iOS中的视频播放与管理

本章深入探讨了如何在iOS中管理视频播放器,包括视频文件的加载、播放、缩略图捕获以及与iPod库的交互。我们学习了如何创建和控制MPMoviePlayerController实例,处理视频播放结束的回调,以及如何使用MPMediaPickerController让用户选择iPod库中的内容。这些内容对于开发需要视频播放功能的iOS应用至关重要。

weixin_31659095的博客 493

从零开始用TS开发babylonjs - 本机环境搭建

babylonjs,初始化本地安装,web3d引擎

han3527638的专栏 797

播放视频内容

Android提供了一个专门的视图控制器android.widget.VideoView,它封装了MediaPlayer的创建和初始化过程。要播放视频,创建一个VideoView小部件并将其设置为用户界面的内容。然后设置视频的路径或URI并触发start()方法。     给出示例代码:      布局xml: <RelativeLayout xmlns:android="http://sc

tan313的专栏 812

EDEM在农业机械设计中的实战应用:以谷物收割机优化为例

本文以谷物收割机优化为例,详细阐述了EDEM离散元仿真软件在农业机械设计中的实战应用。通过构建精准的“数字谷物”模型与农机部件动态界面,利用GPU加速完成大规模颗粒系统仿真,有效诊断并解决了籽粒夹带损失与清选负荷不均等田间难题,实现了从仿真分析到田间验证的设计优化闭环。

weixin_29256771的博客 110

vue 视频播放

/poster: require("/profile/upload/2023/11/21/1700552582344_20231121154319A002.mp4"), //你的封面地址。aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。<el-dialog title="视频" :visible.sync="spopen" width="1200px" append-to-body>loop: false, // 导致视频一结束就重新开始。

WangYuChen优快云的博客 570

KV260-从开箱到人脸识别(小白入门)

波特率选择115200,数据为8位,停止位1位,无奇偶校验,点击链接即可完成通讯。空白的盘格式化之后及进行挂载,这时会被我们的操作系统接手管理,这时就具有了操作系统的属性,复制文件就是在操作系统下的文件系统基础上进行的操作,这个过程是相对的地址进行操作,因此,复制文件是在操作系统环境下完成的更高级的操作模式。空白的盘相当于一整块空白的存储单元,因为没有格式化也不具有文件系统的属性,只有当外部的硬件或者软件写进空白的区域,这种方式是对绝对物理地址进行的操作,因此,烧录文件是独立于操作系统的更低级的写入方式。

qq_53252845的博客 3815

QQ也能连接OpenClaw啦!手机QQ远程操控本地AI保姆级教程

2026年最新OpenClaw与QQ连接教程发布,支持手机远程操控本地AI。腾讯官方推出QQ Bot插件,无需服务器即可实现三步绑定。教程提供三种连接方案:新手首选的扫码连接(10分钟搞定)、稳定的QQ群机器人方案,以及公网接入方案。详细步骤包括版本更新、插件安装、扫码绑定和功能测试,并附常见问题解决方案。该功能让用户通过QQ指令即可实现文件整理、文档生成等电脑操作,真正实现"手机发指令,电脑自动干"。

通俗易懂学IT 594

视频播放器+android,简易视频播放器

NetConnection 对象0002 var netConnection:NetConnection=new NetConnection ;0003 /*如果连接到没有使用服务器的private void play(long position)// 设置mediaPlayer播放视频{try {mMediaPlayer.reset();mMediaPlayer.setDataSourcefm...

weixin_33680199的博客 598

从 0 到 1 玩转小智 AI 智能音箱:开发教程 + 实战项目全攻略

如果说 MCP 是工具箱,那 SDK 就是 “技能模板”—— 小智音箱的自定义技能本质是 “意图识别 + 逻辑响应” 的组合,就像给嵌入式设备写驱动程序,只要按规则调用接口,就能实现各种功能。小智 AI 音箱的开发门槛并不高,核心是利用 MCP SDK 封装好的接口,结合嵌入式开发的 “硬件对接 + 逻辑编程” 思维,就能实现各种自定义功能。从环境搭建到技能开发,再到实战项目落地,每一步都是对 “软件控制硬件” 的实践 —— 而这正是嵌入式开发的核心魅力。

weixin_42300449的博客 1193

鸿蒙视频播放

【代码】鸿蒙视频播放。

2202_75993083的博客 268

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

【BlueDroid】【PBAP】蓝牙电话本协议之同步通讯录分析(超详细)

Header - Type = "x-bt/vcard-listing":代表了该Request对应的Function为PullvCardListing;Profile:PBAP (4),上层应用层协议为PBAP,OBEX协议的上层应用层协议除了PBAP,还有OPP、MAP协议;Response in Frame:该request frame-485对应的Response frame为489;在PBAP协议同步通讯录和通讯记录中,都是基于OBEX协议实现的,PBAP协议作为了应用层协议;

风云说通信 2074

Android实现视频播放的几种实现方式(附带源码)

Android实现视频播放的几种实现方式(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 2920

无人飞行器和车辆的协同配送物资问题——附带MATLAB代码

通过建立城市地图、生成物资点和配送任务、路径规划、协同调度以及仿真和评估等步骤,可以有效地解决物资配送的优化问题。通过建立城市地图、生成物资点和配送任务、路径规划、协同调度以及仿真和评估等步骤,可以有效地解决物资配送的优化问题。我们的目标是最小化物资配送的总时间,同时确保每个物资点都被正确配送的无人飞行器或车辆所访问。我们的目标是最小化物资配送的总时间,同时确保每个物资点都被正确配送的无人飞行器或车辆所访问。我们首先需要建立一个城市地图,包括物资点、无人飞行器的起始点和车辆的起始点。

CyberJolt的博客 951

destoon怎么设置/修改视频播放的宽高? 解决 乐杨俊

设置/修改视频播放的宽高、、、、

乐杨俊浅谈LAMP 1936

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Vue视频播放(Video)

可自定义设置以下属性:视频文件url(src),必传,默认 '',支持网络地址https和相对地址require('...')视频封面url(poster),默认 '',支持网络地址https和相对地址require('...')在未设置封面时,自动截取视频第 second 秒对应帧作为视频封面(second),默认为0.5s视频播放器宽度(width),默认为800px视频播放器高度(height),默认为450px视频就绪后是否马上播放(autoplay),默认为false。

q2724338648的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

视频播放插件

【代码】视频播放插件。

wujing_16的博客 206

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

视频播放

视频播放代码 <div class="innerFrame_introduce" style="width:100%;background-color:#F4F4F4;position:relitive; padding-bottom:10px;min-height:500px; border-right:5px solid #f4f4f4;"> <div style="...

weixin_30301449的博客 84

视频播放器

视频播放器 准备一个布局文件

qq_32890771的博客 242

QML简易视频播放器

import QtQuick 2.14 import QtMultimedia 5.0 import QtQuick.Window 2.14 import QtQuick.Controls 2.14 //运行报错:Warning: "No decoder available for type 'video/x-h264, stream-format=(string)avc... //sudo apt-get install gstreamer1.0-libav 即可解决 Qt在linux下使用gst.

qq_43627981的博客 1140

视频播放测试用例

weixin_45385577的博客 858

基于Android的视频播放APP的设计与实现(支持资料参考_相关定制)

在进行视频播放之前,先给用户呈现出视频列表页,在该页面中,按照视频类型,如古风、校园、奇幻、唯美、穿越等,对视频进行了分类,为了让用户在观看视频前更好地了解视频的大概内容,视频列表中必须包括:视频截图、类型、视频名称、简要介绍。在这个项目中,视频播放是最为核心的一个功能,在这个功能中,不管是界面设计,播放控制,播放流畅度等,都将会对用户的 APP使用体验产生直接的影响,所以这个功能必须得到足够的重视,以下就会对它进行介绍,其中主要的视频列表、播放视频、搜索视频等功能和操作流程。

qq_40828705的博客 378
上一篇: VideoView源码分析
下一篇: 布局优化
CharonChui
博客等级 码龄12年 66粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值