Sunday, November 7, 2021

V2EX - 技术

V2EX - 技术


兄弟们,这个服务器是不是有猫腻,这么便宜

Posted: 07 Nov 2021 02:55 AM PST

企鹅什么时候那么好心了?有没有兄弟买了,和标准的比性能怎么样

企鹅

Go 不是谷歌亲儿子吗?

Posted: 07 Nov 2021 02:39 AM PST

https://developers.googleblog.com/2021/11/announcing-kotlin-support-for-protocol.html

At Google, we're investing deeply in the Kotlin language and ecosystem. Android development is now Kotlin first, our engineering teams work on language evolution through the Kotlin Foundation, and inside of Google we're using Kotlin more and more to build our backend services. We love Kotlin for its expressiveness, safety, simple async support through coroutines, and easy bidirectional interoperability with the Java programming language.

Android12 现在能升级吗

Posted: 07 Nov 2021 02:33 AM PST

手持 pixel4a 时不时蹦出来 12 的升级提示,鉴于之前爆出来的升级 12 后的各种问题,想问问有没有已经用上 Android12 的朋友,感受怎么样

发现中文互联网上的好多页面都没有对 1080P 以上的分辨率优化

Posted: 07 Nov 2021 01:20 AM PST

主要出现在使用 CSS 设置背景图片的时候。

比如 /go/windows 和 https://www.bilibili.com/bangumi/play/ss36182

不知到是在设计的时候没有考虑到 2K 以上的分辨率显示网页,还是技术上的妥协。

请教 5 台物理机器(windows 10)想搭建一个 K8S 集群应该如何操作。比如使用什么平台,有什么注意事项吗?就是玩一玩用。查了下有 Rancher 和 Kubesphere 等,但是还没用过。谢谢

Posted: 07 Nov 2021 01:22 AM PDT

百倍变速--解码到底能不能丢 非参考帧 ? FFmpeg 有话说!

Posted: 07 Nov 2021 01:06 AM PDT

昨天周六,群里面还有人在技术交流!!

默默吐槽一下:这些人真卷啊,大周末还搞技术,是游戏不好玩还是电影不好看。

一开始是讨论剪映的 100 变速是如何实现,群主作为相关人士肯定就不方便透露这些了,不过也有其他大佬给出了思路。

讨论焦点还是围绕如何丢帧展开的。

百倍变速,比如正常速度下一帧是播放第 1s 时刻的内容,而变速后要播放 100s 时刻了。

此时的逻辑有以下几种情况:

  1. 如果下一个播放时刻要超过目前 GOP 大小了,那么就及时 seek 到离目标 pts 最近的关键帧,比如从 1s 变速后到了 100s ,那就 seek 到第 98s 。
  2. 如果下一个播放时刻在同一 GOP 内了,那就继续往下解码,判断解码后的帧 pts 不需要显示就直接丢弃再接着往后解 ,直到接近了目标时间点就显示。
  3. seek 后的时间点没达到目标时间点的情况,需要继续解码的可以重复第二步。

以上是针对群内大佬的总结,拿着小本本赶紧记下来。

此时,还有大佬对解码丢帧给出了其他意见:

主要是针对非参考帧的丢帧处理,也是文章的重点内容。

当我们通过 av_read_frame 得到一个 AVPacket 之后,可以判断它的 nal_ref_idc 值来决定是否要丢弃。

如果为 0 ,说明其他帧不需要参考该帧,可以直接丢弃不发送给解码器,而不是解码后再丢帧。

如果你不清楚 nal_ref_idc 是什么意思 ? 那么可以了解一下 H.264 码流 NALU 的概念。

H.264 码流传输时以 NALU 的形式进行,NALU 主要由一个字节的 HAL Header 和 RBSP 两部分组成。

HAL Header 的组成形式如下图所示:

HAL Header 的计算如下:

forbidden_zero_bit(1bit) + nal_ref_idc(2bit) + nal_unit_type(5bit) 

nal_unit_type 不同的值代表不同类型的帧,解析 AVPacket 完全可以得到如上的信息,后面在公众号音视频开发进阶继续更新文章详解如何计算

所以,在解码时完全是可以丢弃这些非参考帧的,放心大胆地操作吧。

而且丢非参考帧的操作也是经过了产品亿级检测的,这一点我确实可以作证!!!

FFmpeg 中的丢帧

以上的丢帧逻辑是根据 H.264 规范来的,那么在 FFmpeg 的源码中有没有针对这一逻辑做处理呢?

那必然是有的啊!!!

如果仔细看 ffplay 的源码,在源码中有如下的调用方式:

/* this thread gets the stream from the disk or the network */ static int read_thread(void *arg) {     // 省略部分代码     for (i = 0; i < ic->nb_streams; i++) {         AVStream *st = ic->streams[i];         enum AVMediaType type = st->codecpar->codec_type;         // AVDISCARD_ALL  抛弃所有的帧         st->discard = AVDISCARD_ALL;         if (type >= 0 && wanted_stream_spec[type] && st_index[type] == -1)             if (avformat_match_stream_specifier(ic, st, wanted_stream_spec[type]) > 0)                 st_index[type] = i;     }          // 省略部分代码     if (!video_disable)         st_index[AVMEDIA_TYPE_VIDEO] =             av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO,                                 st_index[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);     if (!audio_disable)         st_index[AVMEDIA_TYPE_AUDIO] =             av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO,                                 st_index[AVMEDIA_TYPE_AUDIO],                                 st_index[AVMEDIA_TYPE_VIDEO],                                 NULL, 0);      /* open the streams */     if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {         // 开启解码线程         stream_component_open(is, st_index[AVMEDIA_TYPE_AUDIO]);     }     ret = -1;     if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {        // 开启解码线程         ret = stream_component_open(is, st_index[AVMEDIA_TYPE_VIDEO]);     }     // 省略代码 } 

read_thread 方法运行在单独线程上,该方法首先进行解封装操作,然后开启一个线程进行解码,接下来调用 av_read_frame 方法读取 AVPacket 放到队列中供解码线程使用。

在 av_find_best_stream 方法之前先将 discard 置为 AVDISCARD_ALL ,过滤掉 AVStream 中的数据,接下来就是 stream_component_open 操作。

 /* open a given stream. Return 0 if OK */ static int stream_component_open(VideoState *is, int stream_index) {     // 省略部分代码     // AVDISCARD_DEFAULT 默认模式,过滤无效数据     ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;     switch (avctx->codec_type) {     case AVMEDIA_TYPE_AUDIO:      // 省略部分代码         if ((ret = decoder_start(&is->auddec, audio_thread, "audio_decoder", is)) < 0)             goto out;     // 省略部分代码     case AVMEDIA_TYPE_VIDEO:      // 省略部分代码         if ((ret = decoder_start(&is->viddec, video_thread, "video_decoder", is)) < 0)             goto out;     // 省略部分代码 } 

stream_component_open 方法又将 discard 置为了 AVDISCARD_DEFAULT ,仅过滤掉无效数据。

继续跟进这个 discard 字段,就会有新发现了!

关于 discard 的所有类型值和使用方式,FFmpeg 中有如下定义:

/**  * @ingroup lavc_decoding  */ enum AVDiscard{     /* We leave some space between them for extensions (drop some      * keyframes for intra-only or drop just some bidir frames). */      // 不抛弃,不放弃任何数据     AVDISCARD_NONE    =-16, ///< discard nothing     //  丢掉无用的数据,比如 size 为 0 这种     AVDISCARD_DEFAULT =  0, ///< discard useless packets like 0 size packets in avi     // 丢掉所有的非参考帧     AVDISCARD_NONREF  =  8, ///< discard all non reference     // 丢掉所有的双向帧     AVDISCARD_BIDIR   = 16, ///< discard all bidirectional frames     // 丢掉所有的非内帧     AVDISCARD_NONINTRA= 24, ///< discard all non intra frames     // 丢掉所有的非关键帧     AVDISCARD_NONKEY  = 32, ///< discard all frames except keyframes     // 丢掉所有帧     AVDISCARD_ALL     = 48, ///< discard all }; 

所以,完全可以使用 discard 字段来标识解码时丢弃哪些帧。

另外,在 avcodec_send_packet 方法源码注释中也提示了可以通过 AVCodecContext.skip_frame 字段来决定丢弃哪些帧。

/**  * Internally, this call will copy relevant AVCodecContext fields, which can  * influence decoding per-packet, and apply them when the packet is actually  * decoded. (For example AVCodecContext.skip_frame, which might direct the  * decoder to drop the frame contained by the packet sent with this function.)  *  省略部分注释  */ int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); 

摘录了部分注释内容,写的就很清楚了。

所以,在解码时也可以不用自己解析 AVPacket 的 nal_ref_idc 字段值,直接通过 AVCodecContext.skip_frame 实现同样的目的。

亲测有效,过滤非关键帧之后,解码出来的全是关键帧了。

以上,就是关于丢帧的一些分享,技术交流探讨欢迎加我微信 ezglumes 交流!!!

关于谷歌浏览器的自动填充的问题

Posted: 07 Nov 2021 12:33 AM PDT

谷歌浏览器版本 95.0.4638.69 (正式版本) ( 64 位)
需求:访问任意网站,在输入框不要有任何历史存档的提示。包含且不限于登录,填写邮寄地址。因为历史存档信息不适合展示给其他人看,其中包含了我的小号账号以及家庭住址,因为我的屏幕会定期共享给其他人用于工作相关。
操作:导出存档的所有登录信息(因为谷歌浏览器清理本地缓存的账户信息时,会把云端存档的都删掉),清空了所有历史记录,包含自动填充,在设置里关掉了自动填充相关的功能。
疑问:网上关于关闭谷歌浏览器输入框提示的操作,大多讲的清空历史记录里的自动填充,完整停掉登录框的提醒,是需要清空本地登录信息存档才能实现,还有其他方法实现谷歌浏览器在输入框不提示吗。感觉清空历史记录包括本地存档登录信息的方式实在太粗暴了。

询问一个 Java 注解

Posted: 07 Nov 2021 12:09 AM PDT

我记得有一个注解,它的工作原理是可以在 swagger 接口文档中显示你需要显示的那部分字段,比如一个请求体有 10 个字段,我在创建的时候 swagger 中显示 10 个字段,但是更新接口中显示 5 个字段,删除只显示 1 个字段,其实都是同一个请求体,我记不起是什么字段,看了一下 swagger 的注解,似乎没有一个是我需要的,谢谢各位彦祖

Code Runner for VS Code,下载量突破 3000 万啦~

Posted: 07 Nov 2021 12:02 AM PDT

Il6aZj.png

经过数年时间的打磨,Code Runner 的功能越来越丰富,也支持了超过 50 种语言。

现在,Code Runner 已经有超过 3000 万的下载量了!安装量也接近了 1000 万~

欢迎大家来围观哈: https://github.com/formulahendry/vscode-code-runner

现在 C# .Net Core 最好的社区是啥?中文的

Posted: 06 Nov 2021 11:16 PM PDT

迫于需求,需要尽快熟悉 C# 和 .Net Core

弱弱的问一下,现在 C# Net Core 最好的社区是啥?中文的

请教如何实现 BPMN 图自动布局的其他实现方法?

Posted: 06 Nov 2021 10:31 PM PDT

有一个功能是, 后端通过算法生成一个 BPMN 图出来给前端, 但是图形里所有节点元素的位置都是 x=0 y=0. 需要有一个 自动布局 BPMN 的工具来实现这个 BPMN 图在画布里呈现出来的是可读(有布局) 的效果.

目前在用的是bpmn-auto-layout这个 js 工具库, 但是发现有以下问题:

  1. 解析不了后端生成的 BPMN 图形, 源码里各种报错, 但是该数据上传到 bpmn-js 线上编辑器能正常上传;后面下了源码改了一点点入口代码勉强能解析, 但是还是会有些 BPMN 传进去报错;

  2. 最近遇到部分 BPMN 数据直接导致页面卡死, 必须从任务管理器强关才行, 怀疑是 bpmn-auto-layout 内部代码陷入死循环;

  3. 这个库看起来也没人维护了

目前暂时也没有发现其他类似功能的前端库, 或者是有只是我没找到?

改库里的源码或者自己写一个都需要大量时间, 甚至效果并不理想,目前时间还挺急的.

所以来请教万能的 Ver 们有没有解决方案, 跪谢~

python 有类似的功能库的话也可推荐一下😬

我买了那个 SanDisk 号称最快速度的 SSD 移动硬盘, 1050MB 每秒,但我怎么只有 280M/s 左右?

Posted: 06 Nov 2021 08:18 PM PDT

应该安装个什么驱动么?或者用 USB 3.0 ?

分享:用 nginx 保护 wordpress 免受暴力破解

Posted: 06 Nov 2021 04:32 PM PDT

追踪与中断点陷阱 (核心已转储),何解?

Posted: 06 Nov 2021 01:10 PM PDT

系统是 Manjaro ,桌面 cinnamon 5.0.5 ,内核 5.10.71-1 ,刚装好不久的系统,今天从系统自带的软件商店安装了 proxychains-ng 后发现无法运行,提示:
-------------------------------------------
$ proxychains4 chromium
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/libproxychains4.so
[proxychains] DLL init: proxychains-ng 4.15
[proxychains] DLL init: proxychains-ng 4.15
[proxychains] DLL init: proxychains-ng 4.15
[proxychains] DLL init: proxychains-ng 4.15
追踪与中断点陷阱 (核心已转储)
-------------------------------------------
完全没有见识过这样的问题,放狗搜也完全搜不到解决方案,甚至就没有一个页面上同时出现"proxychains"和 "追踪与中断点陷阱 (核心已转储)"的。

卸载 proxychains-ng 4.15 ,然后去 github 上下载了 4.14 的源码,依照 github 上的说明安装上了,但是完全一样的错误,就是"4.15"变成了"4.14"。

不是程序员,对此束手无策,请大佬们指点一下该怎么让它正常跑起来,谢谢

问个比较小白的 dns 问题

Posted: 06 Nov 2021 12:18 PM PDT

如图,我在路由器内设置了 dns 。 但是我还需要用科学上网插件,这里面也有个国内 dns 。 那么上网的时候到底走哪个呢?谢谢。 https://tva1.sinaimg.cn/large/008ljtgily1gw5voubkolj30ka0eewj9.jpg https://tva1.sinaimg.cn/large/008ljtgily1gw5vp2fpxcj30v60idq9s.jpg

刚刚突然看透了,对于普通人而言,绝大多数云服务都没有意义,只要一个云服务器就行。

Posted: 06 Nov 2021 10:48 AM PDT

"普通人"指的是没啥大名气,只想玩玩云服务、写写小博客的开发者或者极客。

我之前把自己的网站上了各种对象存储、CDN 、安全配置之类的,现在发现,自己的网站日浏览量也就个位数,其他的都是爬虫。所以,这些复杂的云服务其实没有任何意义,徒增运维难度而已。

所以我觉得只需要一个 XX 云的最低配轻量云服务器就够了,所有东西直接放在上面,图片啥的稍微压缩优化一下就好,没那么多需要关心的。

请问 iOS 的 DeviceToken 和 UUID 的变化时机一致么?

Posted: 06 Nov 2021 09:00 AM PDT

有没有可能 UUID 变了但是负责推送的那个 DeviceToken 没变,或者反之的情况,你们有没有研究过这个情况,谢谢

IOS 的群晖管家有安全漏洞?

Posted: 06 Nov 2021 07:06 AM PDT

1 、通过互联网,用 DDNS 也行,用 Quickconnect 也行,一定要从群晖管家的 IOS 客户端进去;
2 、在客户端里面找到"DSM mobile",点进去从右上角设置里面选择"桌面模式";
3 、进桌面模式后,从右下角跳转到 Safari ;
4 、进去以后,就可以从地址栏复制这个地址,如果是"https://****.com/?forceDesktop=1"这种地址,就没有问题。
5 、如果这个分享地址变成这样的"https:// ***.com/?_sid=(一大段特征码)",这时候无论你把这个地址发给谁,他都能不用认证直接访问并管理 NAS 里面的所有数据。

Android 开发者选项里的「正在运行的服务」界面里的「进程」和「服务」分别是什么意思?

Posted: 06 Nov 2021 04:45 AM PDT

如题,在开发者选项中的「正在运行的服务」,其中会有类似「 1 个进程和 2 个服务」这样的字样。但是有时候会出现「 1 个进程和 0 个服务」,并且同时这个 App 也不在前台,按照Android 开发者网站对进程生命周期的解释,没有可见的 Activity ,又没有服务,不是应该是缓存进程吗? 甚至有些时候还会出现「 0 个进程和 1 个服务」,四大组件不是都运行在进程中的吗,0 进程如何还能有 1 个服务呢? 是不是此处的「进程」、「服务」的意思与通常的理解不相同,或者是这个界面里的统计方式比较特别?

从 python2 升级到 python3 有没有一键式工具?

Posted: 06 Nov 2021 03:18 AM PDT

官方的 2to3 貌似还有很多需要手工处理的问题啊,有没有更完善的工具可用?

No comments:

Post a Comment