Monday, November 15, 2021

V2EX - 技术

V2EX - 技术


Vagrant 替换 PVE 和 EXSI 咋样?

Posted: 15 Nov 2021 07:48 AM PST

现在公司用三四台服务器安装的是 PVE 和 EXSI

感觉用起来都不是特别方便,比如说备份和或者创建模板

自己个人用的 Vagrant 感觉很爽,系统模板很多,而且更新也很及时

于是就想着找个时间把 Varant 替换 PVE 和 EXSI

windows 视频播放偏色如何处理?

Posted: 15 Nov 2021 07:47 AM PST



如图,用的是 VLC 最新版

Portplay 直接不能播放,提示 error 。32or64bit 版本都试过

Portplayer.dll error

在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?

Posted: 15 Nov 2021 07:45 AM PST

转一篇: https://mp.weixin.qq.com/s/61yhlJRY6mvbDW5gBJ_3cg

做程序员也 4 年多了,聊聊我这些年的感悟吧。 首先这个问题是掌握了某些概念或技术使自己提升突飞猛进,我觉得这个概念和技术不一定局限于编程概念技术,而是更广阔的,比如说职场技巧、方向等等,因为很多时候"道"方面的领悟比"术"方面的领悟更重要。

01. 技术和晋升是两码事

个人看法:这一条更适用于大公司 还记得刚毕业的时候,傻傻的我认为只需要写好代码提升技术就行了,Leader 自然会给我晋升。现在看来这种想法简直是大错特错,因为技术和晋升是两码事。

技术好是个很微观的事情,它可以体现在每一行代码中,也可以体现在每一个方法的精巧设计中,但是晋升这个事情是你向 Leader 和公司去兜售劳动成果的结果。

比如说如果你一直在做杂活,虽然在杂货中用了很新潮的技术、很精巧的设计,但是这些杂活可能无法体现出价值,无法包装成一个可以向 Leader 和公司兜售的成果,这样肯定是无法晋升的。

如果你想晋升,那么在提升技术的同时,需要思考哪些事情和成果可以支撑你晋升,那么在平时做事的时候尽量往这些事情上去靠近。

所以,晋升和技术,它们之间有关系,但本质上还是两码事。

02. 程序员终究是在做产品

不知道大家对于程序员的定位是什么,以我现在的思考来说,程序员就是做产品的,这个产品又分为两类,一类是技术产品,一类是商业产品。

比如说 Vue ,这就是一个很牛的技术产品,它服务好了广大的前端程序员,它产生了很大价值,那它的作者尤雨溪就很厉害。

比如说某些城市的摇号小程序,就解决了一件事情,就是可以在微信上更好的查看楼盘、摇号、看摇号进度等等,它把这件事情做好了,并且做成了一个产品,那就很厉害,并且在这件事情上还赚的盆满钵满,创造了很大的商业价值。

所以不管职位是什么,细分方向是什么,究其本质,程序员还是做产品的。

03. 重点学和工作相关的技术

这个是血泪的教训,刚毕业的时候学了一堆和工作不沾边的技术,学了没地方实践只能学个皮毛,而且时间长了就忘了,整个人还焦虑的不行。

以我现在的经验来看,学技术优先和重点学习工作相关的,越相关越好,因为这样子你学的东西可以立马用起来,编程是一门实践科学,用的越多越能学的深刻,并且这样子还能有一个正向循环,不停的有正反馈,更能促进技术进步。

以上就是我的一点思考,这里面的观点也许随着工作年限、遇到人和事的增加而改变,但是此时此刻我的想法就是如此,希望对 ta 人有用。

Win10 关机时偶尔弹出 upnp.exe-应用程序错误是为啥?

Posted: 15 Nov 2021 07:24 AM PST

偶尔出现,没有啥规律可寻,大家遇到过吗?或者有什么排查思路吗?<a href="https://sm.ms/image/4OUaAwpPs2ufZDS" target="_blank"><img src="https://i.loli.net/2021/11/15/4OUaAwpPs2ufZDS.jpg" ></a>

遇到一个神奇的 iptables 问题,求解!

Posted: 15 Nov 2021 07:08 AM PST

背景

1 、服务器为亚马逊的 aws lightsail ,今天新建的 2 、系统是 CentOS Linux release 7.9.2009 (Core) 3 、内核是 5.12.19-1.el7 4 、已安装 iptables-services ,iptables 的状态为运行中

问题

添加规则,service iptables save 保存,iptables -L 能看到规则,测试规则生效。

但是,只要断开 ssh ,或者 reboot 服务器,重新 ssh 进去,iptables -L 看到规则清零了,测试规则失效了。vi /etc/sysconfig/iptables 看到规则是在里面的,service iptables restart 后规则重新生效,iptables -L 也能重新看到规则了。

新建了几个实例也还是这样!我之前建的实例却不会出现这个情况。

哪位大神知道这是为什么?

后悔药, 无需 windows.old, 不丢软件数据, 任意回退(Insider Dev -> 稳定版/ Win11 -> Win10)

Posted: 15 Nov 2021 07:03 AM PST

参考文章

https://bbs.pcbeta.com/viewthread-1904414-1-1.html

感谢原作者 Windows_Air 分享的经验, 让我从三天两头升级蓝屏的 dev 版跳车回了稳定版. 原文的操作步骤写的对没用过 ida 的萌新可能有点难懂.这里详细说一下

先准备

  1. 想降级回去的 iso 镜像
  2. ida 免费版就行, 有 pro 的可以用 pro
  3. hex 编辑器, 推荐免费的HxD Hex Editor

操作步骤

  1. 解压 iso 镜像到一个文件夹
  2. 用 ida 打开里面的 /sources/setupcompat.dll
  3. 菜单栏 Search -> Text (快捷键 Alt+T) 输入 ConX::Setup::Common::CWindowsVersion::IsLaterThan 搜索.
  4. 你可以看到类似下面的界面QQ 截图 20211114190048.png
  5. 滚到最底下, 可以看到有个标签只有一行简单的返回指令MOV eax, 1告诉安装程序你的 windows 版本比安装程序新无法保留数据升级安装, 我们把这个 1 改成 0 就好了 QQ 截图 20211114190837.png
  6. 现在我们需要知道这个指令的位置, 点击这个标签然后在菜单栏 Edit -> Patch Program -> Change byte... ,, 上图显示的 offset 就是这个指令的地址了, 或者那个标签里也直接写了 loc_18003BFFE,最后 5 位数 3BFFE 就是我们需要的地址
  7. 打开 Hex 编辑器跳转到上一步找到的 3BFFE 这个地址(HxD 快捷键 Alt+G,注意这个地址是会变的, 得自己去找), 把B8 01 改成 B8 00, 保存退出 QQ 截图 20211114191932.png
  8. 直接运行解压文件夹里的 setup.exe 安装 windows 就行了, 默认是保留全部应用和数据的"升级"安装.

后话: 测试可以从 Win11 各个 Insider Preview 或稳定版互相转, 也可以 Win11 降 Win10, 需要注意的是不要降回 Win10 19041 之前的版本, 之前的版本的安装程序很不稳定. Win11 各版本之间互转基本没有 bug, Win11 降 Win10 会有一些应用商店的 bug 可以参考原文解决.

wsl 对自动化处理来说真的太爽了

Posted: 15 Nov 2021 06:47 AM PST

以前看到别人写的 bash 想转换成 batch 或者 powershell 要么就是去找对应命令的 windows 替代品, 要么就得去看看用 powershell 怎么实现同样的效果, 还很有可能有 bug. 比如下载某个 github 的最新 release(这里用 jellyfin desktop 举例)

bash

curl -s https://api.github.com/repos/jellyfin/jellyfin-media-player/releases/latest \   | grep browser_download_url \   | grep windows-x64.exe \   | cut -d '"' -f 4 \   | wget -qi - 

现在有了 wsl, 可以直接这么写

batch

wsl curl -s https://api.github.com/repos/jellyfin/jellyfin-media-player/releases/latest  | wsl grep browser_download_url  | wsl grep windows-x64.exe  | wsl cut -d '^"' -f 4 | wsl wget -qi - 

只需要注意处理一下转义符之类的问题, 是不是非常简单方便? 还不用担心出 bug.

Python 后端工作三年,每天 CRUD,目标是成为架构师,我仔细想了一下,总结了几点,彦祖们帮忙指点指点

Posted: 15 Nov 2021 06:36 AM PST

如题, 经历的公司都是搞 ToB 的,业务量也不够,每天 CRUD ,在业务需求上扯皮很无聊

业务量有限,现在唯一能在工作中学的只有设计模式了( Python 真的需要什么设计模式吗???)

想想自己在实习的时候就梦想成为架构师,奈何脑子确实不聪明,只能一点点努力瞎摸索

我仔细想了一下,实现路径大概是这样的:

首先,先把自己公司的基础架构摸清楚:如 AWS ,

然后就是常用的组件以及使用场景学会,如 Mysql ,Redis ,ES

紧接着跳槽到小公司应聘架构师岗位,然后以后就能一直干架构了

这么想是对的吗?大家都是怎么成长起来的?请各位指点指点。

雅黑探针在 php7.2.24 中无法正常显示某些数据,这是为什么?

Posted: 15 Nov 2021 06:31 AM PST

https://imgur.com/VIzCPkq

红框中的数据没有显示出来
nginx 是跑在 root
是 php-fpm 权限问题吗?

这是浏览器的 bug 还是 feature,我的 this 呢?

Posted: 15 Nov 2021 06:22 AM PST

MJF5~FMPX_42@_S_IGGL_C3.png

请问有.net 的比较好的实践么

Posted: 15 Nov 2021 06:21 AM PST

最近想搞一个.net 的 web ,之前没怎么接触过,想问问各位有没有比较新,并且比较好的社区实践,拿来学习和借鉴一下。
ps.因为听说.net 内置了很多安全策略..,而且还要支持比较高的并发,所以想用的.net

求推荐一些 ios 端的游戏

Posted: 15 Nov 2021 04:41 AM PST

刚换了 13 ,终于有存储空间和性能玩游戏了。

求大家推荐几个游戏,休闲一点的。

小米手机 7 天后才能解锁 BL,这七天需要一直插着卡吗?

Posted: 15 Nov 2021 04:15 AM PST

备用机想刷一下 PE 。遇到了 7 天后才能解锁 BL 。所以这七天需要一直插着卡吗?插一张不用的卡能行否?

目前是插了一张不用的香港卡,没有开数据流量。能否通过验证?

轻量云的多核是不是没给足?

Posted: 15 Nov 2021 04:12 AM PST

跟风买了 198 的轻量云服务器,用 geekbench 跑了一下,单核 1000 ,双核 1300 。 单核比我的轻薄本 CPU ( i5-8250U )好,但是双核才多了 300 ,感觉轻量云实际给的差不多 1.5 核,没有 2 核。

此外另外还有个问题,为什么 geekbench 看到的 L3 缓存是 256M ?

Processor Information   Name                          AMD EPYC 7K62 48-Core Processor   Topology                      1 Processor, 2 Cores   Identifier                    AuthenticAMD Family 23 Model 49 Stepping 0   Base Frequency                2.60 GHz   L1 Instruction Cache          64.0 KB x 2   L1 Data Cache                 64.0 KB x 2   L2 Cache                      512 KB x 2   L3 Cache                      256 MB 

Windows 11 右键新建的快捷键如何找回?

Posted: 15 Nov 2021 03:15 AM PST

以前版本的 Windows ,新建文件夹,只要鼠标右键,然后左手按 W, F 就可以了 很方便。Windows 11 里这个没了。有找回的方法吗?

有没有 fabricjs 高手,问一下,怎么在一个对象上自由绘制?

Posted: 15 Nov 2021 02:17 AM PST

实现类似微信截屏功能,在一个( IMAGE OR GROUP )对象上涂鸦,添加对象等

如果你需要购买 MWeb 4.0,请使用 App Store 购买。

Posted: 15 Nov 2021 02:11 AM PST

这是由于 MWeb 4.0 ,作者使用了一个全新的授权系统。如果你自己忘记取消电脑上的注册,就无法再取消注册了。

因为作者明确表示,不会处理反注册的工作。

如果你需要购买 MWeb 4.0 ,推荐你在 App Store 购买。

分布式网链创业经济体建设者招募

Posted: 15 Nov 2021 01:45 AM PST

我们由谁组成?

我们是一个由技术开发者、产品设计师、创业者、大学生、跨学科探索者共同组成的分布式网链创业经济体 - Comunion

我们为什么聚在一起?

在这个人工智能与自动化正在逐渐剥夺人类就业机会的年代,我们看到到自己靠无休止的内卷保留自己工作机会的辛酸,我们看到创业追梦者在巨头的碾压下对现实躺平的无奈,我们看到传统从业者对如何在数字社会生存的彷徨……我们希望能够借由涌现的力量像网一样链接在一起,共同建设属于每一位平凡创新者的创业经济体

在这个经济体的建设过程中,我们致力于解决以下问题:

  • 提升劳动者收益
  • 打破巨头垄断
  • 降低创业门槛
  • 降低贫富差距
  • 打破阶层固化

我们在做什么事情?

  1. 我们在创造下一代组织形式与创业互助网络
  2. 我们在开发面向数字时代的全新商业基础设施
  3. 我们在探索能够高效产出生产力的分布式组织形式

我们产品的特性是?

  1. 去中心化的组织与运营形式
  2. 价值导向的人才交易网络与结算方式
  3. 劳动价值与资本价值量价一致
  4. 重新定义组织募资方式
  5. 社群共治,人才多节点连接

我们的现状?

组织结构类似于分布式基金会结构,最高治理机构为治理委员会,下设三个管理委员会:成员管理委员会、开发管理委员会和网链基金会,分别对应人、钱、事

产品研发目前已在以太坊 Goerli 测试网顺利运行,目前正在从易用性、视觉、安全等角度进行全面升级,预计最晚将于明年五月一日正式登录以太坊主网

组织成员目前大多利用闲暇工作时间进行经济体建设,少数核心成员已开始全职建设;成员分布区域有北京、上海、河北、南京、武汉、成都、杭州、阿布扎比、尼日利亚等;目前主要经济体建设成员 49 人,直接参与产品开发成员 15 人

我们希望成员拥有哪些技能?

  1. 资深的 Golang 后端工程师
  2. 成熟的 Vue 前端工程师
  3. 成熟的 Solidity 智能合约工程师
  4. 产品经理
  5. UI/UE 设计师
  6. 社群、媒体运营师
  7. 组织建设师
  8. 其他愿意共同建设的小伙伴

加入我们能够得到什么?

有形资产:我们会把所有工作拆成若干个相对独立的任务,在任务开始之前,根据任务工作量进行相对客观的评估,并标定与之相对应的团队发展权益报酬。当任务完成的时候,我们会按照这个报酬金额进行支付。同时我们设计了团队发展权益与产品本身的价值绑定机制,以后经济体成长的同时团队发展权益的价值也会增长。团队发展权益可在产品主网上线后与法币进行兑换(目前不支持法币结算)

无形资产:整个团队由共同的愿景凝聚在一起,经历了三年的发展,团队成员整体信任度很高,我们也在协作的过程中探索出一套适用于网状分布式组织大规模协作的生产力理论和工具。我们衷心的希望每一位成员能够学到这套体系的精髓,在疫情常态化和分布式办公比重增加的趋势下,积累更多面向未来的协作技能。更希望每一位成员能够利用团队中的优质人脉,在我们共同构建的创业范式之下开启自己的事业,实现自己的人生价值

了解更多:

官网https://comunion.org/

Wikihttps://wiki.comunion.io/

BBS: https://bbs.comunion.io/

联系信息:

微信:QianChen_2020

邮箱chen.qian@comunion.org

influxdb 有没有在用,能不能谈谈怎么样

Posted: 15 Nov 2021 01:36 AM PST

不知道大家有没有使用过 influxdb ,用哪个版本比较好些,这个和 SQL 区别大吗

gitLab CI/CD 打 jar 包问题

Posted: 15 Nov 2021 12:53 AM PST

问题描述:使用 gitLab CI 打的 jar 包,然后打成镜像部署,发现 outh2 找不到用户。

然后使用本地打的 jar 打成镜像并部署,没有问题。

下载了 gitLab CI 打的 jar 包,解压,用命令

jar -cfM0 xx.jar ./

重新打成 jar 。好使了 有人知道这是怎么回事吗

Google play 和 app stroe app 下载量统计数据如何 获取? 有做过相关业务的大神请赐教

Posted: 15 Nov 2021 12:47 AM PST

golang 中 goroutine 使用 chan 数据丢失的问题

Posted: 15 Nov 2021 12:16 AM PST

下面的代码,注释的地方,通过 for range 遍历时 go show1(x) 可以正常输出 1 到 10

但是使用 for 遍历时 go show2(x) 有时候不能完整的输出,只能输出 1 到 9 ,会丢失一部分

想问下是否我代码中 goroutine 使用的有问题,还是说只能通过 for range 给 goroutine 传值?

var ( 	wg = sync.WaitGroup{} )  func show1(x int) { 	defer wg.Done()  	fmt.Println(x) }  func show2(ch chan int) { 	defer wg.Done()  	c := <-ch 	fmt.Println(c) }  func main() { 	ch1 := make(chan int, 40)  	for i := 1; i < 11; i++ { 		ch1 <- i 	} 	close(ch1)  	// for x := range ch1 { 	// 	wg.Add(1) 	// 	go show1(x)  	// }  	for j := 1; j < len(ch1)+1; j++ { 		wg.Add(1) 		go show2(ch1) 	}  	wg.Wait() } 

如何使用 Windows API 查询 Intel 集成显卡型号

Posted: 14 Nov 2021 11:37 PM PST

我最近写了一个命令像 neofetch/screenfetch 获得基本的电脑和硬件信息,使用 IDXGIFactory1::EnumAdapters1 接口(或者 WMI )可以获得显卡的型号,但 Intel 集成显卡只会显示 Intel (R) UHD Graphics 而不是像 Mac 一样显示 Intel UHD Graphics 630,请有什么方式能够通过编程手段获得 Intel 集显的具体型号?谢谢。

https://github.com/baulk/baulk/pull/40

[求助帖] 迫于公司没人整,接了 kuboard 配置 rocketmq 的任务,有没有大佬指点一下

Posted: 14 Nov 2021 11:31 PM PST

搜索了一上午,没有看到能说明白的,希望整过的大佬能指点下

关于进程和 PHP -fpm 的一些疑惑

Posted: 14 Nov 2021 11:05 PM PST

最近在看 CSAPP ,看到进程部分,结合之前的 PHP 学习,有一些问题请教下各位 V 友:

  1. 通过 pstree 32765 -np 可以看到 fpm 的进程结构如下图,这里的父进程( 32765 )在 fork 了子进程后,还会处理请求吗?还是只负责管理子进程?
    php-fpm(32765)─┬─php-fpm(508)                ├─php-fpm(2527)                └─php-fpm(3344) 
  2. 子进程在处理完一个请求后会退出吗? fpm 除了在达到 pm.max_requestspm.process_idle_timeout 的预设值退出外,还会在什么机制下退出呢? fpm 的一个子进程会在一个请求生命周期结束后处理新的请求吗?
  3. 常说一个应用程序就是一个进程,像 Nginx 或 php-fpm 又会 fork 多个子进程,那此时的 Nginx 和 PHP 是有几个进程呢? 1 个吗?因为子进程都由父进程管理?
  4. 每个进程都有独立的文件描述符表, 我看默认大小是 1024 ,如果一个请求依赖打开超过 1024 个资源,那是不是这个请求就无法正常处理了呢?
  5. 当 fpm 通过 tcp 的方式与 Nginx 通信时,默认的 fpm 端口是 9000 ,不同的子进程是如何都通过 9000 和 Nginx 通信的呢?还是子进程有不同的端口呢?

PHPStorm 许可证在更新到新版本后需要重新购买吗?

Posted: 14 Nov 2021 10:53 PM PST

发布新版后要重新购买吗

哪里能找到相关资料

百度翻译用的还是 PHP 吗

Posted: 14 Nov 2021 10:25 PM PST

😲

image.png

image.png

请小伙伴有偿将我们的 tinyDebian 从 Debian 10 / kernel 4.19.x 移植到 Debian 11 + kernel 5.10.x

Posted: 14 Nov 2021 09:59 PM PST

大家好,

我们的 tinyDebian 操作系统运行在 NanoPi Duo2 板子。

请小伙伴有偿将我们的 tinyDebian 从 Debian 10 移植到 Debian 11 + kernel 5.10.x 。

有意者,请邮件 info@usb7.net

优酷 Android 客户端后台播放音频问题

Posted: 14 Nov 2021 09:50 PM PST

优酷看视频时,可以切换为音频,并且给出的提示是:息屏或优酷应用切换到后台,音频依然可以正常播放,但是实际上我切换到后台或息屏,过了 10s 左右,音频停止了播放,需要重新回到应用才继续播放 我的手机是鸿蒙 2.0 ,应该不会限制这个吧,顺便提问:这种后台播放音频功能 Android 一般什么来实现

FFmpeg 调用 MediaCodec 硬解码到 Surface 上

Posted: 14 Nov 2021 06:39 PM PST

原文链接: https://glumes.com/post/ffmpeg/ffmpeg-call-mediacodec-deocde-to-surface/

这是关于 FFmpeg 和 MediaCodec 爱恨情仇系列的第三篇文章了。

之前写了 FFmpeg 调用 MediaCodec 进行硬解码的内容。

另外也给出了 FFmpeg 的编译脚本,轻松搞定编译问题。

众所周知,MediaCodec 的解码能力不仅可以解码出 YUV 数据,还能直接解码到 Surface 上。

在短视频领域中,MediaCodec 解码到 Surface 上的能力反而更加常用,这样就能将画面转到 OES 纹理上,从而进行后续各种渲染操作。

之前介绍的 FFmpeg 调用 MediaCodec 进行硬解码只是解码出了 Buffer 数据,没有把解码到 Surface 上的能力用起来。

再看了更多资料之后,发现 FFmpeg 调用 MediaCodec 已经可以解码到 Surface 上。

具体参考的是这篇邮件内容:

http://mplayerhq.hu/pipermail/ffmpeg-devel/2016-March/191700.html

在这里面详细介绍了这种能力,挑重点截图一下:

图片内容介绍的很详细,按照步骤实践就好了。

代码实践

如果熟悉了 FFmpeg 调用 MediaCodec 解码 Buffer 数据的流程,那么解码到 Surface 只是在流程上稍微改动一点就行。

首先要准备好 Surface 对象,在 Java 上层构建好 Surface 对象通过 NDK 传到 Native 层,传下来的是一个 jobject 对象。

如果不熟悉 NDK 的话,可以看看我在慕课网上的录制的免费课程:

Android NDK 免费视频在线学习!!!

其次是两个新的函数方法:

av_mediacodec_alloc_context 和 av_mediacodec_default_init 方法就是让 Surface 和 AVMediaCodecContext 、AVCodecContext 三者之间产生关联。

具体就是 AVCodecContext 持有 AVMediaCodecContext ,AVMediaCodecContext 持有 Surface 。

至于为什么要关联,因为在 FFmpeg 源码里要根据 Surface 是否为 nullptr 对 MediaCodec 的初始化和解码后的数据做不同处理。

感兴趣的可以阅读这块的源码,内容不多通俗易懂。

等到解码之后,FFmpeg 同样会返回一个 AVFrame 数据,只不过它的 data 字段不再是 Buffer 内容了。

AVFrame 的格式不再是 NV12 (解码 Buffer 数据的话就是 NV12 ),而是自定义的 AV_PIX_FMT_MEDIACODEC ,代表走的 Surface 模式。

if (s->surface) {    // surface 不为 null 的情况下:    // 通过 mediacodec_wrap_hw_buffer 对数据进行处理   if ((ret = mediacodec_wrap_hw_buffer(avctx, s, index, &info, frame)) < 0) {     av_log(avctx, AV_LOG_ERROR, "Failed to wrap MediaCodec buffer\n");        return ret;   } } 

Surface 模式下对数据的处理是 mediacodec_wrap_hw_buffer 函数,Buffer 模式就是 mediacodec_wrap_sw_buffer 函数了。

同时,真正解码后的数据存储在 AVFrame->data[3] 字段上,这个字段是个老员工了。

一般解码非 Buffer 数据的情况,都会将特殊的内容保存到 data[3] 上,比如 Window 上的硬解,部分源码如下:

static int mediacodec_wrap_hw_buffer(AVCodecContext *avctx,                                   MediaCodecDecContext *s,                                   ssize_t index,                                   FFAMediaCodecBufferInfo *info,                                   AVFrame *frame) // 省略部分源码 // 创建   AVMediaCodecBuffer 对象 buffer = av_mallocz(sizeof(AVMediaCodecBuffer)); frame->buf[0] = av_buffer_create(NULL,                        0,                        mediacodec_buffer_release,                        buffer,                        AV_BUFFER_FLAG_READONLY); // buffer 相关属性赋值 buffer->ctx = s; buffer->serial = atomic_load(&s->serial); if (s->delay_flush)     ff_mediacodec_dec_ref(s); // index 索引,代表 mediacodec 中 buffer 的索引 buffer->index = index; buffer->pts = info->presentationTimeUs; // 将 buffer 赋值给 data[3] 字段 frame->data[3] = (uint8_t *)buffer; 

有了 AVFrame 数据之后,Surface 上还是没有画面。

回想一下,在 MediaCodec 上想要数据渲染到 Surface 还得调用一个 releaseOutputBuffer 方法,其中第二个参数要传 true 才可以。

public void releaseOutputBuffer (int index, boolean render) 

同样,在 FFmpeg 中也有这么个方法。

int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); 

buffer 就是 frame->data[3] 的内容,render 的含义和 releaseOutputBuffer 中的含义一致。

另外 releaseOutputBuffer 方法第一个参数 index 其实就已经在 buffer 中赋值过了。

这样一来,解码后就可以直接上屏渲染展示啦。

 AVMediaCodecBuffer *buffer = (AVMediaCodecBuffer *) frame->data[3];  av_mediacodec_release_buffer(buffer, 1); 

完整代码实践可以在公众号 音视频开发进阶 回复 1019 获取。

经过测试验证确实可行,不过直接不断解码上屏的速度是很快的,可不止视频播放 30ms 一帧的速度哦,想要来做播放器的话,还得自己管理控制一下了。

另外,完整代码演示中直接解码到了 SurfaceView 的 Surface 上。

除此之外,还可以解码到 SurfaceTexture 构造的 Surface 上,这样就可以用到 SurfaceTexture 的 OnFrameAvailableListener 回调方法, 并且还可以用 attachToGLContext 方法关联到 OpenGL 环境上,每次解码时通过 updateTexImage 更新画面,实现解码到 OES 纹理的目标,具体操作起来也是很容易方便。

Go 关于类型定义的问题

Posted: 14 Nov 2021 05:37 AM PST

type Error byte

func (err Error) Error() string {
return "SOCKS error: " + strconv.Itoa(int(err))
}

func main() {
fmt.Println(Error(1))
}
=========
当我执行上述程序时,返回的结果是:
SOCKS error: 1
我认为应该返回的结果是:1
请各位大佬指点一下

No comments:

Post a Comment