自然资源部晒出我国矿产资源“家底” 矿业绿色发展取得
人民网北京12月3日电 (记者杨曦)矿产资源家底数据是基本国情国力的重要组成部分。近日,自然资源部发布的《中
大家好,这里hg56th56gd6g
最近(已经不是最近了)想整个24小时无人直播,内容是音频可视化,观众可以通过弹幕点歌,并对自己点的歌做一些控制(快进,删除...)
以及,项目还没写好,文章仅作为一些小tips的记录
(资料图片仅供参考)
目前视频部分打算用libprojectm+h264_qsv因为是音频可视化,所以视频部分做的很水,无可奉告
电脑和带宽都不太行
音频部分就是很常规的从平台抓音频链接
之前的测试里,b站直播只支持aac编码,但不会对它重编码,所以直接用这个参数压就行
参数介绍:
-b:a 529200
cbr 529200bps码率(529.2kbps,在44100采样率下是最高码率)
编码速度会随着码率提高而骤降,粗略测试了一下,大概有的波动;cpu:core i5 7500
这个速度的单位x是倍速,例如60s的流,用了10s编码完成,就是6x
529.2k:15x左右
520k:17x左右
510k:19x左右
505k:21x左右
500k:25x左右
这里速度衰减非常严重
400k:47x左右
320k:55x左右
192k:75x左右
128k:78x左右
64k:95x左右
32k:115x左右
-aac_coder fast
Constant quantizer method.
Uses a cheaper version of twoloop algorithm that doesn’t try to do as many clever adjustments. Worse with low bitrates (less than 64kbps), but is better and much faster at higher bitrates.
常数量化器方法。
使用一种更便宜的双环算法,它不会尝试做那么多巧妙的调整。较低的比特率(低于64kbps)更糟糕,但在较高的比特率下更好、更快。
很显然最高码率属于较高码率了()
-profile:a aac_low
用aac_lc规格,没什么好说的,高码率下更好更快,且兼容性比he-aac好
或许b站也根本不支持he-aac,懒得测了
-cutoff 22050
不切高频
之前记得看过一个文章忘了在哪,忘了具体内容有说过采样率和频谱的关系来着
剩下两个是很常规的2声道和44100hz采样率
据说fdk-aac性能会更好,不过不差aac这点性能,之后再研究也行,这个码率下应该也没啥质量差别
控制部分略过,不是重点,接下来说一下播放列表的大体架构
注意:
每个用户只能操作自己的资源
首先从弹幕拿到的字符串作为BuildString(一个url/歌曲id,支持多平台/歌曲名字,取搜索第一项)来构建"资源"对象(它保存了歌曲的唯一标识,用户uid,歌曲数据等)解析(爬虫学的好,牢饭吃到饱)拿到音频url,然后在子进程传给ffmpeg解码成pcm,绑定到对应的资源对象
用户在请求快进,跳过等等操作时就对资源对象里的pcm进行操作
然后有一个统一的接口从播放列表中取任意数量的pcm采样
一个ffmpeg的push进程,接收pcm和图像原始数据,编码并推流
从接口取pcm数据,往push进程里送,这是第一个输入;把刚才取出的数据往libprojectm里送,然后把libprojectm输出再往push进程里送,这是第二个输入
大概就这样,看起来说起来挺简单的,写起来细节一堆,难受
速率同步
之前测试有一个很严重的问题,就是直播间里过几秒就要缓冲一下,然后时间跳到几秒后
找了一下,问题出在推流太快
问题来了:ffmpeg只有对输入的"-re"参数限制输入速率,不能限制输出速率
两个办法
把输入变成可以限制速率的东西
手动控制输入来限制速率
测试时用的是1解决,具体命令如下:
原理很简单,把编码和推流独立成两个进程
把编码进程的stdout接到推流进程的stdin(匿名管道,io重定向)
编码进程不做限制,将数据写到自己的stdout,推流进程限制输入速率,从自己的stdin读,然后流复制,推流
因为管道的缓冲区大小限制,编码进程疯狂输出会被阻塞,直到推流进程读出一些数据
直播里为了性能,就用2了,正好libprojectm那里也要限制速率,所以直接不做限制的读libprojectm的输出就行,然后音频管道如果写的比视频管道快了缓冲区满了会阻塞,一直写就行
直播里用的是50fps整数毫秒的间隔太香了
实时渲染的帧率控制真麻烦
在windows下使用命名管道与ffmpeg传输数据
在push进程里有这样一个问题:有两个输入流(音频和视频),但是只有一个ffmpeg的stdin(pipe:0)可以用
这时候有人要问了:为啥不直接调ffmpeg的api呢,还能减少开销
太麻烦了
ffmpeg的pipe后面那个数字目前还不知道怎么指定的,那就试试named pipe吧,直接把管道名作为文件名传就行
创建命名管道:
关于这个管道名称,主要是为了避免和其他东西重名,毕竟是全系统共用的,不知道其他程序会整个什么名字出来
还是很好理解的,就是有点长
hg56th56gd6g
live
test
ffmpeg
push
process
audio/video
data
测试代码:
意外的能用(喜)
下面是测试过程,解码音频命令也用于播放列表的解码
略过一些无关信息
内置aac好像总是会把采样格式转为float32,fdk-aac就只接收s16,不过这无伤大雅
能用就行
关键词:
Copyright 2015-2022 太平洋艺术网 版权所有 备案号:豫ICP备2022016495号-17 联系邮箱:93 96 74 66 9@qq.com