精华内容
下载资源
问答
  • I 帧时间间隔

    万次阅读 2017-03-11 11:11:49
    MPEG编码将画面(即)分为I、P、B三种,I是内部编码,P是前向预测,B是双向内插。简单地讲,I是一个完整的画面,而P和B记录的是相对于I的变化。没有I,P和B就无法解码,这就是MPEG格式难以...
    GOP(Group of Pictures)策略影响编码质量:所谓GOP,意思是画面组,一个GOP就是一组连续的画面。MPEG编码将画面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变化。没有I帧,P帧和B帧就无法解码,这就是MPEG格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。

    关键帧包含了显示帧需要的所有信息

    所有的视频都至少包含一个关键帧,作为文件的第一个帧。其它的关键帧可用来改善视频的质量,不过它们也会增加文件大小。一般而言,每一秒视频至少需要使用 1 个关键帧。若使用此公式,在每秒播放 25个帧的视频中,每 25 个帧就会有 1 个关键帧。增加关键帧个数可改善质量,但是同时增加带宽和网络负载。

    两种彩电视频制式:
    NTSC (525 lines @ 59.94 Hz)  29.97 fps
    PAL (625 lines @ 50 Hz)  25 fps

    NTSC和PAL属于全球两大主要的电视广播制式,但是由于系统投射颜色影像的频率而有所不同。NTSC是National Television System Committee的缩写,其标准主要应用于日本、美国,加拿大、墨西哥等等,PAL 则是Phase Alternating Line的缩写,主要应用于中国,香港、中东地区和欧洲一带。

    GOP最大可含帧数目:18 (NTSC) / 15 (PAL)

    GOP是由固定模式的一系列I帧、P帧、B帧组成。
    I帧编码是为了减少空间域冗余,P帧和B帧是为了减少时间域冗余。
    常用的结构由15个帧组成,具有以下形式IBBPBBPBBPBBPBB。简称GOP(4,2),指的是该图像组除了一个I帧外,包含了4个P帧,并且任何两个P帧或者I、P之间都有两个B帧。
    展开全文
  • 最近在研究google的ExoPlayer,根据项目需求,需要获得当前的显示时间,看源码发现解码在MediaCodecVideoRenderer这个类中执行解码,发现processOutputBuffer函数内有时间数据,根据测试知道presentationTimeUs是...

    最近在研究google的ExoPlayer,根据项目需求,需要获得当前帧的显示时间,看源码发现解码在MediaCodecVideoRenderer这个类中执行解码,发现processOutputBuffer函数内有时间数据,根据测试知道presentationTimeUs是显示时间,然后就是想办法把时间给我们了

    既然想改源码,那先下载源码,源码

    新建个module,把core,dash,hls,smoothstreaming,ui文件夹内的代码和资源都复制到这个module内

    新建个interface VideoTimeListener

    public interface VideoTimeListener {
        void onVideoTimeChanged(long time);
    }
    修改MediaCodecVideoRenderer,添加一个VideoTimeListener和构造函数

    private VideoTimeListener timeListener;
    public MediaCodecVideoRenderer(Context context, MediaCodecSelector mediaCodecSelector,
                                   long allowedJoiningTimeMs,
                                   @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
                                   boolean playClearSamplesWithoutKeys, @Nullable Handler eventHandler,
                                   @Nullable VideoRendererEventListener eventListener,VideoTimeListener timeListener, int maxDroppedFramesToNotify) {
      super(C.TRACK_TYPE_VIDEO, mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys);
      this.allowedJoiningTimeMs = allowedJoiningTimeMs;
      this.maxDroppedFramesToNotify = maxDroppedFramesToNotify;
      this.context = context.getApplicationContext();
      frameReleaseTimeHelper = new VideoFrameReleaseTimeHelper(context);
      eventDispatcher = new EventDispatcher(eventHandler, eventListener);
      deviceNeedsAutoFrcWorkaround = deviceNeedsAutoFrcWorkaround();
      pendingOutputStreamOffsetsUs = new long[MAX_PENDING_OUTPUT_STREAM_OFFSET_COUNT];
      outputStreamOffsetUs = C.TIME_UNSET;
      joiningDeadlineMs = C.TIME_UNSET;
      currentWidth = Format.NO_VALUE;
      currentHeight = Format.NO_VALUE;
      currentPixelWidthHeightRatio = Format.NO_VALUE;
      pendingPixelWidthHeightRatio = Format.NO_VALUE;
      scalingMode = C.VIDEO_SCALING_MODE_DEFAULT;
     
      this.timeListener = timeListener;
     
      clearReportedVideoSize();
    }
    在renderOutputBuffer和renderOutputBufferV21内添加 

     

     

     

    protected void renderOutputBuffer(MediaCodec codec, int index, long presentationTimeUs) {
      //...省略代码
      if(timeListener != null){
        timeListener.onVideoTimeChanged(presentationTimeUs/1000);
      }
    }
    @TargetApi(21)
    protected void renderOutputBufferV21(
        MediaCodec codec, int index, long presentationTimeUs, long releaseTimeNs) {
      //...省略代码
      if(timeListener != null){
        timeListener.onVideoTimeChanged(presentationTimeUs/1000);
      }
    }
    修改RenderersFactory的createRenderers

    Renderer[] createRenderers(Handler eventHandler,
                               VideoRendererEventListener videoRendererEventListener,
                               AudioRendererEventListener audioRendererEventListener,
                               VideoTimeListener videoTimeListener,TextOutput textRendererOutput,
                               MetadataOutput metadataRendererOutput);
    修改DefaultRenderersFactory的createRenderers和buildVideoRenderers

    @Override
    public Renderer[] createRenderers(Handler eventHandler,
        VideoRendererEventListener videoRendererEventListener,
        AudioRendererEventListener audioRendererEventListener,
        VideoTimeListener videoTimeListener,
        TextOutput textRendererOutput, MetadataOutput metadataRendererOutput) {
      ArrayList<Renderer> renderersList = new ArrayList<>();
      buildVideoRenderers(context, drmSessionManager, allowedVideoJoiningTimeMs,
          eventHandler, videoRendererEventListener,videoTimeListener, extensionRendererMode, renderersList);
      //省略代码
      return renderersList.toArray(new Renderer[renderersList.size()]);
    }
     
    protected void buildVideoRenderers(Context context,
        @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
        long allowedVideoJoiningTimeMs, Handler eventHandler,
        VideoRendererEventListener eventListener,VideoTimeListener videoTimeListener, @ExtensionRendererMode int extensionRendererMode,
        ArrayList<Renderer> out) {
      out.add(new MediaCodecVideoRenderer(context, MediaCodecSelector.DEFAULT,
          allowedVideoJoiningTimeMs, drmSessionManager, false, eventHandler, eventListener,videoTimeListener,
          MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
      //省略代码
    }
    修改SimpleExoPlayer的构造函数

    private final CopyOnWriteArraySet<VideoTimeListener> videoTimeListeners;
    protected SimpleExoPlayer(
        RenderersFactory renderersFactory,
        TrackSelector trackSelector,
        LoadControl loadControl,
        Clock clock) {
      componentListener = new ComponentListener();
      videoListeners = new CopyOnWriteArraySet<>();
      textOutputs = new CopyOnWriteArraySet<>();
      metadataOutputs = new CopyOnWriteArraySet<>();
      videoDebugListeners = new CopyOnWriteArraySet<>();
      audioDebugListeners = new CopyOnWriteArraySet<>();
      videoTimeListeners = new CopyOnWriteArraySet<>();
      Looper eventLooper = Looper.myLooper() != null ? Looper.myLooper() : Looper.getMainLooper();
      Handler eventHandler = new Handler(eventLooper);
      renderers = renderersFactory.createRenderers(eventHandler, componentListener, componentListener,
          componentListener, componentListener,componentListener);
      //省略代码
    }
    在SimpleExoPlayer添加函数

    public void addVideoTiemListener(VideoTimeListener listener){
      videoTimeListeners.add(listener);
    }
    public void removeVideoTiemListener(VideoTimeListener listener){
      videoTimeListeners.remove(listener);
    }
    修改ComponentListener

    ComponentListener implements VideoRendererEventListener,
        AudioRendererEventListener, TextOutput, MetadataOutput, SurfaceHolder.Callback,
        TextureView.SurfaceTextureListener,VideoTimeListener
    @Override
    public void onVideoTimeChanged(long time) {
      for (VideoTimeListener videoTimeListener : videoTimeListeners) {
        videoTimeListener.onVideoTimeChanged(time);
      }
    }
    好了,准备工作完成,在exoplayer初始化的时候

    player.addVideoTiemListener(new VideoTimeListener() {
        @Override
        public void onVideoTimeChanged(long time) {
            videoTime = time;
        }
    });
    经过和ffmpeg解码出来的数据对比

    exoplayer数据

    ffmpeg

    例子代码

    百度云

    密码:addl

     

     

    展开全文
  • 嵌入式 I帧时间间隔

    2013-12-02 14:50:22
    关键包含了显示需要的所有信息 所有的视频都至少包含一个关键,作为文件的第一个。其它的关键可用来改善视频的质量,不过它们也会增加文件大小。一般而言,每一秒视频至少需要使用 1 个关键。若使用...
    关键帧包含了显示帧需要的所有信息

    所有的视频都至少包含一个关键帧,作为文件的第一个帧。其它的关键帧可用来改善视频的质量,不过它们也会增加文件大小。一般而言,每一秒视频至少需要使用1 个关键帧。若使用此公式,在每秒播放 25个帧的视频中,每 25 个帧就会有 1 个关键帧。增加关键帧个数可改善质量,但是同时增加带宽和网络负载。

    两种彩电视频制式:
    NTSC (525 lines @ 59.94 Hz)  29.97fps
    PAL (625 lines @ 50 Hz)  25fps

    NTSC和PAL属于全球两大主要的电视广播制式,但是由于系统投射颜色影像的频率而有所不同。NTSC是NationalTelevision System Committee的缩写,其标准主要应用于日本、美国,加拿大、墨西哥等等,PAL 则是PhaseAlternating Line的缩写,主要应用于中国,香港、中东地区和欧洲一带。

    GOP最大可含帧数目:18 (NTSC) / 15 (PAL)

    GOP是由固定模式的一系列I帧、P帧、B帧组成。
    I帧编码是为了减少空间域冗余,P帧和B帧是为了减少时间域冗余。
    常用的结构由15个帧组成,具有以下形式IBBPBBPBBPBBPBB。简称GOP(4,2),指的是该图像组除了一个I帧外,包含了4个P帧,并且任何两个P帧或者I、P之间都有两个B帧。
    展开全文
  • 游戏的帧时间

    千次阅读 2014-07-19 18:42:38
    之前用Flash做点小游戏,的概念很明确,是一个弹性的几

    之前用Flash做点小游戏,帧的概念很明确,是一个弹性的机制,EnterFrame中并没有返回什么参数,如24帧,最终执行的帧数可能是<=24帧,耗时的操作回导致帧数下降,以前做的时候记得在EnterFrame开始的时候,获取系统时间,在结束的时候再获取一次,来简单的计算下时间查,只是都是一些小游戏,没有用。之后用cocos2dx,update函数带有一帧时间差参数,看了cocos2dx的引擎主循环,发现这个时间是准确的,包括了代码和渲染的时间。假如写一个子弹从y=0,移动到-100,fps 60,60帧移动2个单位,那就直接在update方法中写上

    void Bullet::update(float dt){
        CCPoint position = this->getPosition();
        position.y -= 2/60;
        setPosition(position);
    }
    这样的结果就是,游戏一帧移动2/60个单位,但是相同时间内跑帧次数可能不同,就导致子弹一秒移动的距离不固定,当帧率降低时候,速度就变小了
    void Bullet::update(float dt){
        CCPoint position = this->getPosition();
        position.y -= 2*dt;
        setPosition(position);
    }

    程序这样写的话,2*dt,2表示的是子弹一秒移动多少,速度就是2/s,dt表示帧之间的时间差,2*dt,就是子弹的位移差,这样,每次update刷新游戏的时候,就让子弹显示在他应该在的位置,这样就保证了子弹以时间来做移动。这样的结果就是当帧率降低的时候,子弹跳帧。单整体还是比第一种要好的多,保证游戏的整体速度

    这几种方法在帧率相同的时候,移动的速度是一样的,如1秒内,update都60次,(2/60)x60 = 2(dt1+dt2...dt60) = 2;

    在线游戏第二中方法就格外重要

    展开全文
  • opencv 读取一帧时间及imshow耗时

    万次阅读 2016-12-21 11:19:13
    由于想知道自己电脑i7 使用opencv读取一速度,测试视频大小为480*640,发现当使用VideoCapture::read()读取一,并用imshow显示图像,总共需耗时15ms左右,相当于每秒66左右,分别对两个函数测试时,发现单读取...
  • 主要是所有0x1017的时间为1000,默认心跳时间为1s /* index 0x1017 : Producer Heartbeat Time. */ UNS16 slave_objdict_obj1017 = 1000; /* 0 */ subindex slave_objdict_Index1017[] = { { RW, uint16, sizeof ...
  • usb2.0 和微

    2020-04-27 22:46:23
    usb主机和设备控制器同步后,每个微帧起始点开始传输数据,在一个微帧时间里,usb host轮训各个device 一个微帧传输时间里,可以进行 控制传输,中断传输,批量传输,同步传输。 通常微帧起始时间到来时,host 控制...
  • 5G/4G:空口结构之、子、时隙、符号、RB。

    万次阅读 多人点赞 2019-07-15 21:39:31
    帧(Frame)的时间仍然是10ms,分为10个子帧(Subframe),编号为#0~#9,每个子帧时间为1ms,一个时隙所包含的OFDM符号数为14个(normal cp),每一帧又可以分为两个半帧(half-frame),编号...
  • USB1.1 时间帧管理

    2019-06-22 04:04:08
    但是对于同步传输和中断传输,均要考虑时间帧管理。USB1.1中用frame来考量时间,USB2.0中添加了微microframe。每个frame代表1ms,每个microframe代表125us。某一时间单元内的非周期性传输(控制传输和批量传输)...
  • 在MediaCodec硬编码中设置I关键帧时间间隔,在API中是这么设置的 mMediaCodec = MediaCodec.createByCodecName(debugger.getEncoderName()); MediaFormat mediaFormat = MediaFormat.createVideoFormat(...
  • 这篇文章的原文地址是:...里面主要介绍了如何提取视频关键,以及视频关键时间点信息,这样就能做出各大视频网站的那种:点击视频下方进度条,显示该时间点附近关键图片的效果。
  • 帧率(FPS):每秒钟播放的数 1、如果你想直接通过数间隔截取视频,那直接使用可以使用下面的代码: import cv2 cap = cv2.VideoCapture("./query_video/test_video_0.mp4") c = 1 frameRate = 100 # ...
  • H264 ipb详解

    千次阅读 2019-10-17 20:46:26
    一、前言 H264是新一代的编码标准,以高压缩高质量和支持多种网络的流...所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像A,随后的B就不编码全部图像,只写入与A的差别,这样B的大小就只有...
  • 时间轴,关键

    2010-02-04 15:10:00
    理解、关键、空白关键时间轴上的小方格叫单元格。可以把单元格转化为、关键、空白关键。 当播放头移到上时,的内容就显示在舞台上。 与关键都用来记录舞台的内容,但是只能显示离它
  • 所谓“帧结构”就是在一帧时间内的时间分配关系,它包括了时隙、码位、同步与标志信号的分配关在30/32路PCM通信系统中,在125us时间内,每一路轮流传送8位码的码组一次(共32路)即为一帧,每一路的8位码在一帧中占...
  • MediaMetadataRetriever根据指定时间截取 2017.10.26 [摘要:使用MediaMetadataRetriever获取指定时间点的,并保存到图库中。当我需要实现这个功能时,第一时间是从百度查,但是查的有好多坑,有些不明白。希望...
  • 和关键,空白

    千次阅读 2014-07-04 17:56:19
    ——是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的构成的,在时间轴上的每一都可以包含需要显示的所有内容,包括图形、声音、各种素材和其他多种对象。 关键——...
  • 图像和流媒体 -- I ,B,P,IDR的区别

    万次阅读 多人点赞 2017-06-27 10:19:49
    参看:什么是I,P,B参看:H264编码原理以及IBP一、H246简介 H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参照一段时间内图像的统计...
  • 无限 时隙

    2019-02-18 13:05:00
    无限 1.三个层次 无限->子->时隙 2.无限是LTE时间结构的最大单位,时长10ms 3.无限编号:0~1023(1024制式) ...子 ...1.一个无限由10个子组成,每个子为1ms,...1.子并不是LTE时间结构基...
  • 1)ADTS header位于每一个aac的开头,长度一般是7字节(也可以是9字节的,没见过)。  2)每个aac的长度固定为1024个sample(可以是1024*n,没见过n>1的情况)。  3)ADTS header中大部分信息无用,有用...
  • I,P,B简介

    2016-04-25 22:08:55
    I frame :内编码 又称intra picture,I 通常是每个 GOP(MPEG 所使用的...P frame: 前向预测编码 又称predictive-frame,通过充分将低于图像序列中前面已编码时间冗余信息来压缩传输数据量的编码图像,也
  • 1. 特点 ——是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的构成的,在时间轴上的每一都可以包含需要显示的所有内容,包括图形、声音、各种素材和其他多种对象。...
  • 时间速率管理

    2017-05-25 16:05:00
    原文链接:... Update()函数允许你有规律地监视输入和其它事件,并作出正确的行为。例如,你可以移动一个角色当“forward”键被按下时。值得记住的是,当处理基于时间的行...
  • 关键,就是说这一...普通是用来计量播放时间或过渡时间用的,不能手动设置普通的内容,它是播放过程中由前后关键以及过渡类型自动填充的,手动插入或删除普通,会改变前后两个关键之间的过渡时间。 ...
  • 先简单记录下最近对AAC音频学习的打包时间计算以及估算平均大小。打包时间,其实是可以音频处理上通用的;而估算平均大小,是由于AAC单个的大小并非是固定的,因此估算的是一个平均大小。 samples 做音频...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,269
精华内容 5,707
关键字:

帧时间