田克平(94338047) 16:57:34
能自己设置某帧为关键帧吗?
抱柱者(86311414) 16:57:59
to 田克平
可以
田克平(94338047) 17:00:00
呵呵,把丢包后的下一帧设置为I帧可以吗?来处理丢帧现象
☆雪天/kf☆(279373002) 17:00:42
这个难度大了
田克平(94338047) 17:01:15
难度在哪?
抱柱者(86311414) 17:01:53
如果1to1那应该可行,但是要是传到多点那可能比较麻烦
田克平(94338047) 17:03:54
谢谢
抱柱者(86311414) 17:04:05
比如传至A、B两点,到A的丢包很少,而到B丢包较多,那A也要因为B点而经常接受关键帧
抱柱者(86311414) 17:04:29
不过你也可以现象折中的方法
抱柱者(86311414) 17:04:38
不过你也可以想想折中的方法
田克平(94338047) 17:04:48
就1to1的话、、、
田克平(94338047) 17:05:11
怎么做
抱柱者(86311414) 17:05:22
就像你说的做啊
抱柱者(86311414) 17:05:50
丢包了就通知编码端,下一帧编为关键帧
田克平(94338047) 17:06:07
好的,谢谢
☆雪天/kf☆(279373002) 17:06:16
田克平(94338047) 17:00:00
呵呵,把丢包后的下一帧设置为I帧可以吗?来处理丢帧现象

编码的时候你怎么会知道哪一帧会丢?

☆雪天/kf☆(279373002) 17:07:55
除非你有反馈通道
抱柱者(86311414) 17:08:58
肯定是反馈啊,正常可能是丢包了就通知编码端重发,现在改为通知编码端设置关键帧
傻子更聪明(120928606) 17:09:43
这样好象实时性比较差啊,也难免不会再被丢。
呵呵(369873095) 17:10:11
网络的来回时间考虑了吗(RTT)
☆雪天/kf☆(279373002) 17:10:15
这样效率很低呀
☆雪天/kf☆(279373002) 17:10:25
你编码器一直要等在那里
抱柱者(86311414) 17:11:07
他是设置下一帧为关键帧,而不是处理丢了的那一帧,所以实时性应该没有问题
田克平(94338047) 17:11:09
丢包了不通知吗
☆雪天/kf☆(279373002) 17:11:21
两次传输路径时间+解码器处理时间 编码器无法并行
☆雪天/kf☆(279373002) 17:12:25
就是说你反馈回来的时候 编码器已经编到后面去了 丢的哪一帧后面的一帧 早编完了
抱柱者(86311414) 17:12:57
编码器为什么要等?
编码器就按正常的编码,如果解码器反馈丢包了,应用程序就修改编码参数设置关键帧,与并行扯不上关系
田克平(94338047) 17:12:58
好像是这样啊
傻子更聪明(120928606) 17:14:09
网络UDP不可靠传输,多少秒来一个关键帧比较合适?
抱柱者(86311414) 17:14:16
为什么要局限于下一帧,下两帧也没关系啊
抱柱者(86311414) 17:14:35
反正只是要尽快出现一个关键帧就行了
☆雪天/kf☆(279373002) 17:15:13
你说的没错 但是一个反馈的时间编码器可能已经编码了好多帧了
☆雪天/kf☆(279373002) 17:15:56
所以只能说是一接到反馈就立即置I帧
☆雪天/kf☆(279373002) 17:22:06
可以结合周期插入I帧一起来用 周期可以大一点

田克平(94338047) 17:23:10
关键帧间隔是定好的、、、
抱柱者(86311414) 17:23:15
肯定是会有固定关键帧周期的
傻子更聪明(120928606) 17:23:48
这种方法是在关键帧间隔比较大的情况下可以用。
田克平(94338047) 17:24:42
2s间隔有什么问题
傻子更聪明(120928606) 17:25:06
而且非关键帧丢失后怎么处理?会有花屏之类的。
傻子更聪明(120928606) 17:25:39
把导致花屏的帧丢掉后,图象会有停顿。
田克平(94338047) 17:25:52
间隔很小的话当然是作用不大
☆雪天/kf☆(279373002) 17:25:58
那也没有办法 只能跳到下一个I帧
呵呵(369873095) 17:26:24
在码率大的时候,一帧的数据都是由几十个包承载的,多个包里掉一个包(几个包)是否反馈要求I帧
☆雪天/kf☆(279373002) 17:27:21
那倒不用 使用EC足够应付了
傻子更聪明(120928606) 17:27:22
网络传输应该不用I帧吧?把I帧全变为IDR帧,这样才有意义。
sunj(39310543) 17:28:42
这个问题有rfc来定义的
傻子更聪明(120928606) 17:28:42
错误掩藏,解码器不支持的话,怎么整。也需要编码器支持吧?。
sunj(39310543) 17:28:52
消息已经标准化了
☆雪天/kf☆(279373002) 17:29:34
简单的块copy就可以搞定这个了 不需要编码器做什么
傻子更聪明(120928606) 17:31:12
这样子,也是会引起连续的失真。。

☆雪天/kf☆(279373002) 17:22:06
可以结合周期插入I帧一起来用 周期可以大一点

田克平(94338047) 17:23:10
关键帧间隔是定好的、、、
抱柱者(86311414) 17:23:15
肯定是会有固定关键帧周期的
傻子更聪明(120928606) 17:23:48
这种方法是在关键帧间隔比较大的情况下可以用。
田克平(94338047) 17:24:42
2s间隔有什么问题
傻子更聪明(120928606) 17:25:06
而且非关键帧丢失后怎么处理?会有花屏之类的。
傻子更聪明(120928606) 17:25:39
把导致花屏的帧丢掉后,图象会有停顿。
田克平(94338047) 17:25:52
间隔很小的话当然是作用不大
☆雪天/kf☆(279373002) 17:25:58
那也没有办法 只能跳到下一个I帧
呵呵(369873095) 17:26:24
在码率大的时候,一帧的数据都是由几十个包承载的,多个包里掉一个包(几个包)是否反馈要求I帧
☆雪天/kf☆(279373002) 17:27:21
那倒不用 使用EC足够应付了
傻子更聪明(120928606) 17:27:22
网络传输应该不用I帧吧?把I帧全变为IDR帧,这样才有意义。
sunj(39310543) 17:28:42
这个问题有rfc来定义的
傻子更聪明(120928606) 17:28:42
错误掩藏,解码器不支持的话,怎么整。也需要编码器支持吧?。
sunj(39310543) 17:28:52
消息已经标准化了
☆雪天/kf☆(279373002) 17:29:34
简单的块copy就可以搞定这个了 不需要编码器做什么
傻子更聪明(120928606) 17:31:12
这样子,也是会引起连续的失真。。

main()
{
...
     while (decode_one_frame(img, input, snr) != EOS);
...
}

然后在decode_one_frame()

{
     ...
    currSlice->next_header = -8888;
    .....
     while ((currSlice->next_header != EOS && currSlice->next_header != SOP))
     {
            current_header = read_new_slice();
            if (current_header == EOS)
            {
                  exit_picture();
                  return EOS;
             }
            decode_slice(img, inp, current_header);
                 ...
       }
     ...
     exit_picture();
     return (SOP);
}

按照上面的代码,经过跟踪发现,currSlice->next_header 一直不变,那么decode_one_frame()中的while循环永远不会因为条件的不满足而跳出循环,只会因为current_header == EOS条件的满足而推出该函数。
因此 decode_one_frame()函数只可能返回EOS,而不会是SOP;那么main()中的while循环将只会执行一次。而且在代码跟踪的过程中发现,输入码流的所有序列是在decode_one_frame()函数中全部解出,然后才推出该函数。
请教各位,jm为什么要这样呢?还是我什么地方没注意到?谢谢了

A:再次仔细跟踪了一下代码发现,jm整个解码的结构是这样的:
1。在main中调用while (decode_one_frame(img, input, snr) != EOS);
但实际上,这个while只会循环一次,因为decode_one_frame()只可能返回EOS(下面讲为什么?)
2。在decode_one_frame()中通过调用
    while ((currSlice->next_header != EOS && currSlice->next_header != SOP))
    {
         current_header = read_new_slice();
         if (current_header == EOS)
         {
               exit_picture();
               return EOS;
         }
         decode_slice(img, inp, current_header);
                ...
   }
解码所有帧。如上所述,currSlice->next_header根本没有起到任何作用,因为没有其他地方为 其赋值,为什么呢?
因为如果要想知道next_header必须要将下一个slice码流读进来,再进行解析,既然已经读进来,不管判断的是一个新的pic,还是同一个pic中的新的slice,都必须立刻进行解码,也就没有必要再回到main()中的while循环了。
实际上起作用的是current_header,即通过read_new_slice()来获得,(sop or sos):
       if(is_new_picture())
       {
      init_picture(img, input);

current_header = SOP;//start of pic
       }
       else
      current_header = SOS;//start of slice

如果current_header=sop,那么将会调用init_picture(),这个函数主要实现两个功能:首先,通过exit_picture()把上一次解码的图像及相关信息进行保存等处理 然后,再为当前slice(新的一帧)的解码做好准备。如果current_header=sos,那么将不会调用init_picture(),直接利用当前pic的准备信息进行解码。如果在read_new_slice()中发现已经到码流的结尾了,那么将返回EOS.

这时在decode_one_frame()中,一旦current_header==EOS,那么将退出解码,返回到main()中来。值得注意的是,返回之前,它还是调用了exit_picture(),从而将最后一个解码帧进行保存。

大概流程应该就是这样,如果有漏掉或错误的地方还请高手补充指正。总之jm中的有些函数的内容并不一定与其函数名称相吻合,这可能也是他们开发到后期没有办法的事情。不知道x264或其他的解码器是不是如此复杂?

关键帧 关于decode_one_frame函数相关推荐

  1. 跟踪线程 深度 双目初始化位姿 运动模型 关键帧模式 重定位 局部地图跟踪 关键帧

    /** * This file is part of ORB-SLAM2. * * * mpMap就是我们整个位姿与地图(可以想象成ORB-SLAM运行时的那个界面世界), * MapPoint和Ke ...

  2. 关键帧与地图点(二):关键帧

    本次我们要讲解的是ORBSLAM2中的关键帧,首先我们来看一下论文中关于关键帧的相关描述:每个关键帧 K i K_i Ki​存储了以下内容: 相机的位姿 T i w T_{iw} Tiw​,注意这里是 ...

  3. ORB-SLAM2代码详解05: 关键帧KeyFrame

    pdf版本笔记的下载地址: ORB-SLAM2代码详解05_关键帧KeyFrame,排版更美观一点,这个网站的默认排版太丑了(访问密码:3834) ORB-SLAM2代码详解05: 关键帧KeyFra ...

  4. SVO 学习笔记(三)

    SVO 学习笔记(三) 这篇博客 Initialization Frame_Handler_Mono processFirstFrame processSecondFrame processFrame ...

  5. (一次性搞定)ORB_SLAM2地图保存与加载

    (一次性搞定)ORB_SLAM2地图保存与加载 本文记录了ORB_SLAM2中地图保存与加载的过程. 参考博客: https://blog.csdn.net/qq_34254510/article/d ...

  6. ORB-SLAM2代码/流程详解

    ORB-SLAM2代码详解 文章目录 ORB-SLAM2代码详解 1. ORB-SLAM2代码详解01_ORB-SLAM2代码运行流程 1 运行官方Demo 1.2. 阅读代码之前你应该知道的事情 1 ...

  7. ORB-SLAM2从理论到代码实现(八):Tracking.cc程序详解(下)

    bool Tracking::NeedNewKeyFrame() 函数功能 判断是否需要生成新的关键帧,确定关键帧的标准 步骤 1. 在上一次进行重定位之后,过了20帧数据,或关键帧数小于20个,不满 ...

  8. html 按下和松开事件,JQuery通过键盘控制键盘按下与松开触发事件

    JQuery通过键盘控制键盘按下与松开触发事件 效果图: HTML部分: 首先设置几个盒子,用来构建这个页面的大致框架. 给盒子相应的类名以及id,方便css的布局以及JQuery的获取. 在盒子内放 ...

  9. Cocos Creator中的动画支持技术

    Cocos Creator主要亮点 官方的权威描述是:Cocos Creator是以内容创作为核心的一体化游戏开发工具,这个引擎基于Cocos2d-x,组件化,脚本化,数据驱动,跨平台发布. 本人使用 ...

最新文章

  1. 上海交大开源训练框架,支持大规模基于种群多智能体强化学习训练
  2. Replication主要配置项
  3. Linux 第60,61天 ansible的playbook
  4. 【Python进阶】你真的明白NumPy中的ndarray吗?
  5. Mac 配置支持 opengl 的 opencv 4.2
  6. FineReport:任意时刻只允许在一个客户端登陆账号的插件
  7. MyBatis 之 SqlMapConfig.xml 配置
  8. Web项目(四)————异步队列的实现
  9. Java日期时间格式转换
  10. Python代码大全,海量代码任你下载
  11. java短视频开发技术_看Java学员如何用前后端分离技术搭建短视频健身APP
  12. Android 实现定位
  13. 【JS基础】JavaScript中的void 0
  14. Socket UDP、TCP 简介
  15. 如何更改CSDN博客皮肤
  16. 光模块COB工艺之耦合激光焊
  17. VMware虚拟机/Hyper-V在(校园网/PPPoe拨号上网)环境无法上网解决方案
  18. 三门问三羊问题与三个思考角度
  19. 华为笔试题-素数伴侣
  20. 交直流与电路分析三板斧

热门文章

  1. C#中struct和class的区别详解
  2. linux将汇编转为机器码,汇编语言 高级语言 机器语言 本地代码
  3. Windows上快速在指定目录打开cmd.exe命令行的方法
  4. 执行 redis-dump 报错:Error connecting to Redis on localhost:6379 (Redis::TimeoutError)
  5. *【牛客 1 - A】矩阵(字符串hash)
  6. 【牛客 - 330F】Applese 的QQ群(拓扑排序,二分)
  7. 【HDU - 2546】饭卡 (dp,0-1背包,贪心思想)
  8. 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)
  9. php百度搜索框代码,基于jquery的仿百度搜索框效果代码_jquery
  10. 通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值