• 关于

    数据缓冲是什么

    的搜索结果

回答

确实跟缓冲区有关, getch每次调用,从标准输入缓冲区中读入1个字符,但如果缓冲区中没有数据,则会阻塞程序,等待直到缓冲区里有数据。 那么什么时候有数据呢? -- 当你按回车的时候,之前键入的所有字符,包含回车自身,一并被送入输入缓冲区 所以,当缓冲区为空时,无论你输入多少个字符,只要不按回车,getch()函数会一直等在那里。 第一个程序,输入asxsas回车后,getch()获取到第一个字符a,之后的字符还在缓冲区内,当程序退出时,缓冲区销毁,里面的数据也随之消失。 第二个程序可以自己体会下。 第三个程序,翻译一下 每当( (从缓冲区读一个字符) 不等于 '#' ) 执行 { 啥也不干,继续循环 }只有当读到#的时候,才因不满足循环条件而跳出,继续执行下面的putchar,当然 此时打印出的就是 # getchar返回int类型这个是API里定义的规范,但是你可以将它赋值给一个char类型的变量,这里会自动做int -> char的隐式类型转换,这个转换,会丢失高位字节,但是对于getch()返回的数据来说,他的范围是0-127,高位字节永远都是0,丢了也无所谓

a123456678 2019-12-02 02:39:10 0 浏览量 回答数 0

回答

1.阻塞与同步2.BIO与NIO对比3.NIO简介4.缓冲区Buffer5.通道Channel6.反应堆7.选择器8.NIO源码分析9.AIO1.阻塞与同步1)阻塞(Block)和非租塞(NonBlock):阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候阻塞:往往需要等待缞冲区中的数据准备好过后才处理其他的事情,否則一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回2)同步(Synchronization)和异步(Async)的方式:同步和异步都是基于应用程序私操作系统处理IO事件所采用的方式,比如同步:是应用程序要直接参与IO读写的操作。异步:所有的IO读写交给搡作系统去处理,应用程序只需要等待通知。同步方式在处理IO事件的时候,必须阻塞在某个方法上靣等待我们的IO事件完成(阻塞IO事件或者通过轮询IO事件的方式).对于异步来说,所有的IO读写都交给了搡作系统。这个时候,我们可以去做其他的事情,并不拓要去完成真正的IO搡作,当搡作完成IO后.会给我们的应用程序一个通知同步:阻塞到IO事件,阻塞到read成则write。这个时候我们就完全不能做自己的事情,让读写方法加入到线程里面,然后阻塞线程来实现,对线程的性能开销比较大,参考:https://blog.csdn.net/CharJay_Lin/article/details/812598802.BIO与NIO对比block IO与Non-block IO1)区别IO模型 IO NIO方式 从硬盘到内存 从内存到硬盘通信 面向流(乡村公路) 面向缓存(高速公路,多路复用技术)处理 阻塞IO(多线程) 非阻塞IO(反应堆Reactor)触发 无 选择器(轮询机制)2)面向流与面向缓冲Java NIO和IO之间第一个最大的区别是,IO是面向流的.NIO是面向缓冲区的。Java IO面向流意味着毎次从流中读一个成多个字节,直至读取所有字节,它们没有被缓存在任何地方,此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的教据,需要先将它缓存到一个缓冲区。Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,霱要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数裾。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。3)阻塞与非阻塞Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。4)选择器(Selector)Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择"通道:这些通里已经有可以处理的褕入,或者选择已准备写入的通道。这选怿机制,使得一个单独的线程很容易来管理多个通道。5)NIO和BIO读取文件BIO读取文件:链接BIO从一个阻塞的流中一行一行的读取数据image | left | 469x426NIO读取文件:链接通道是数据的载体,buffer是存储数据的地方,线程每次从buffer检查数据通知给通道image | left | 559x3946)处理数据的线程数NIO:一个线程管理多个连接BIO:一个线程管理一个连接3.NIO简介在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,面向流的I/O速度非常慢,而在Java 1.4中推出了NIO,这是一个面向块的I/O系统,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据库,按块处理要比按字节处理数据快的多。在NIO中有几个核心对象需要掌握:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。参考:链接image2.png | center | 851x3834.缓冲区Buffer缓冲区实际上是一个容器对象,更直接的说,其实就是一个数组,在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,它也是写入到缓冲区中的;任何时候访问 NIO 中的数据,都是将它放到缓冲区中。而在面向流I/O系统中,所有数据都是直接写入或者直接将数据读取到Stream对象中。在NIO中,所有的缓冲区类型都继承于抽象类Buffer,最常用的就是ByteBuffer,对于Java中的基本类型,基本都有一个具体Buffer类型与之相对应,它们之间的继承关系如下图所示:image3.png | center | 650x3681)其中的四个属性的含义分别如下:容量(Capacity):缓冲区能够容纳的数据元素的最大数量。这一个容量在缓冲区创建时被设定,并且永远不能改变。上界(Limit):缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。位置(Position):下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新。标记(Mark):下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新。2)Buffer的常见方法如下所示:flip(): 写模式转换成读模式rewind():将 position 重置为 0 ,一般用于重复读。clear() :compact(): 将未读取的数据拷贝到 buffer 的头部位。mark(): reset():mark 可以标记一个位置, reset 可以重置到该位置。Buffer 常见类型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、 ShortBuffer 。3)基本操作Buffer基础操作: 链接缓冲区分片,缓冲区分配,直接缓存区,缓存区映射,缓存区只读:链接4)缓冲区存取数据流程存数据时position会++,当停止数据读取的时候调用flip(),此时limit=position,position=0读取数据时position++,一直读取到limitclear() 清空 buffer ,准备再次被写入 (position 变成 0 , limit 变成 capacity) 。5.通道Channel通道是一个对象,通过它可以读取和写入数据,当然了所有数据都通过Buffer对象来处理。我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的缓冲区。同样不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。image4.png | center | 368x191在NIO中,提供了多种通道对象,而所有的通道对象都实现了Channel接口。它们之间的继承关系如下图所示:image5.png | center | 650x5171)使用NIO读取数据在前面我们说过,任何时候读取数据,都不是直接从通道读取,而是从通道读取到缓冲区。所以使用NIO读取数据可以分为下面三个步骤:从FileInputStream获取Channel 创建Buffer 将数据从Channel读取到Buffer中 例子:链接 2)使用NIO写入数据使用NIO写入数据与读取数据的过程类似,同样数据不是直接写入通道,而是写入缓冲区,可以分为下面三个步骤:从FileInputStream获取Channel 创建Buffer 将数据从Channel写入到Buffer中 例子:链接 6.反应堆1)阻塞IO模型在老的IO包中,serverSocket和socket都是阻塞式的,因此一旦有大规模的并发行为,而每一个访问都会开启一个新线程。这时会有大规模的线程上下文切换操作(因为都在等待,所以资源全都被已有的线程吃掉了),这时无论是等待的线程还是正在处理的线程,响应率都会下降,并且会影响新的线程。image6.png | center | 739x3362)NIOJava NIO是在jdk1.4开始使用的,它既可以说成“新IO”,也可以说成非阻塞式I/O。下面是java NIO的工作原理:1.由一个专门的线程来处理所有的IO事件,并负责分发。2.事件驱动机制:事件到的时候触发,而不是同步的去监视事件。3.线程通讯:线程之间通过wait,notify等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。image7.png | center | 689x251注:每个线程的处理流程大概都是读取数据,解码,计算处理,编码,发送响应。7.选择器传统的 server / client 模式会基于 TPR ( Thread per Request ) .服务器会为每个客户端请求建立一个线程.由该线程单独负贵处理一个客户请求。这种模式带未的一个问题就是线程数是的剧增.大量的线程会增大服务器的开销,大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这又带来了新的问题,如果线程池中有 200 个线程,而有 200 个用户都在进行大文件下载,会导致第 201 个用户的请求无法及时处理,即便第 201 个用户只想请求一个几 KB 大小的页面。传统的 Sorvor / Client 模式如下围所示:image8.png | center | 597x286NIO 中非阻塞IO采用了基于Reactor模式的工作方式,IO调用不会被阻塞,相反是注册感兴趣的特点IO事件,如可读数据到达,新的套接字等等,在发生持定率件时,系统再通知我们。 NlO中实现非阻塞IO的核心设计Selector,Selector就是注册各种IO事件的地方,而且当那些事件发生时,就是这个对象告诉我们所发生的事件。image9.png | center | 462x408当有读或者写等任何注册的事件发生时,可以从Selector中获得相应的SelectionKey,同时从SelectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据。使用NIO中非阻塞IO编写服务器处理程序,有三个步骤1.向Selector对象注册感兴趣的事件2.从Selector中获取感兴趣的事件3.根据不同事件进行相应的处理8.NIO源码分析Selector是NIO的核心epool模型1)SelectorSelector的open()方法:链接2)ServerSocketChannelServerSocketChannel.open() 链接9.AIOAsynchronous IO异步非阻塞IOBIO ServerSocketNIO ServerSocketChannelAIO AsynchronousServerSocketChannel

wangccsy 2019-12-02 01:46:51 0 浏览量 回答数 0

回答

首先呢这个bytes是干什么的?缓冲区,就是防止大数据量的时候,我们每次只读取一部分数据到缓冲区中进行操作那么这个len又是什么呢?它是实际的读取字节的数你如果学过数据结构就知道这是一种线性表的思想因为有时候读取的数据是不能填满这个bytes的,那么len就是实际的数你抓住读取思想:每次都是读取文件的bytes大小数据放到bytes数组中所以取的时候自然是从bytes的0处去取buf.append(new String(bytes,0,len));加上len,用于防止最后一次的操作错误,最后一次取的数据实际长度是小于等于bytes的长度的,如果小于,那么bytes还残留着上次的数据。所以使用len来读取最后一次实际取的数据。建议去看看线性表

蛮大人123 2019-12-02 02:28:52 0 浏览量 回答数 0

Quick BI 数据可视化分析平台

2020年入选全球Gartner ABI魔力象限,为中国首个且唯一入选BI产品

问题

安卓 使用MediaPlayer怎么实现边播放边 下载

爵霸 2019-12-01 20:05:36 1425 浏览量 回答数 1

回答

当缓冲区达到一定量后则开始播放,以后就是一边接收一边播放?为什么非得等到缓冲区一定量后再播放呢,一边接收一边播放不行吗?那样的话也不会出现数据覆盖的现象了 ###### 引用来自“yaoyaoling”的答案 当缓冲区达到一定量后则开始播放,以后就是一边接收一边播放?为什么非得等到缓冲区一定量后再播放呢,一边接收一边播放不行吗?那样的话也不会出现数据覆盖的现象了 也可以只要收到数据后就播放,这些都不是问题,问题是多长时间发一次如何确定。 ######多长时间播放,使用定时器就行######synchronize一下不就好了嘛。。。###### 引用来自“CoserSeu”的答案 synchronize一下不就好了嘛。。。 关键是如何同步呢? ######生产者消费者同步啊

kun坤 2020-06-06 16:09:25 0 浏览量 回答数 0

回答

老实说,你@我之前,我就看过你这个问题,但是我觉得挺棘手的,因为我自己觉得我也搞不定,所以没敢开腔,但是,被你@了,不站出来似乎有点乌龟了……1 “在mes1和mes2的信息被输出到stdout时都在其尾部被加上了一个换行符”,这个确实是不应该的,我在Windows下用vs2010试验过,并没有这样。至于linux为什么这样,我也不知道。2 “stdout是行缓存的(在本机试验过也确实如此)”,那你是如何证明这一点的呢?h或许你真的证明了,那我只能说linux的行为对我来说有点费解。你觉得fclose()另外一个文件,会强迫stdout输出吗?可是为了实际证明这一点,你把fclose()注释掉,试一下。或许我说的是错的。3 “input file 的buffer 好像与stdout终端的buffer没有什么直接的联系”,肯定是这样的,要联系也是程序让他们有联系,否则不乱套了?4 文件以"r"模式打开,而且文件是全缓冲,我的理解是缓冲区中的内容不是自动就填充的,而是你使用fread()或其他读的函数,系统会将读取的内容自动放到这个缓冲区,并返回你的读取函数。如果下次读的数据还是这个缓冲去范围内的数据,就直接从这个缓冲去复制,不直接读文件了。但是如果不在范围,还是要实际读取文件的,从而再次更新缓冲区。5 根据我知道的资料,fflush()是把缓冲区中的数据刷新到磁盘(真正的写入)。对于以读模式打开的文件,应该不需要同步,因为根本没有也不能修改文件;6 文件可以被同时打开为读和写。很多时候都是一个线程写文件,而另一个线程从这个文件读取,这算是线程通讯的一种办法。只要文件指针(读写位置)保持正确就可以了。实际上,在windows下面文件要想这样,必须打开时共享读写,不能独占式访问。但是简单的c库函数做不到这一点,能不能,听天由命了(要看读写这个文件的其他进程是否设置共享)。7 “如果可以,那么它们申请的应该是两个不同的缓存空间吗?",我要说的是一个FILE *指针对应一个缓冲区,如果只用一个,那不乱套,你写乱我的,我搞乱你的。多从常识,原理角度考虑问题,常识,原理应该这样,那么程序也应该这样。否则,程序也会出现问题的。

a123456678 2019-12-02 02:45:20 0 浏览量 回答数 0

问题

有使用协议缓冲区的经验吗?

游客ufivfoddcd53c 2020-01-03 18:20:44 0 浏览量 回答数 1

回答

因为sprintf是不安全的,所以默认情况下编译器拒绝编译包含对它调用的代码。#define _CRT_SECURE_NO_WARNINGS 可以让编译器对此放行。什么叫不安全呢?我们知道,对于x86处理器来说,程序的数据和指令都是放在同一个内存中的,如果我们开辟的缓冲区比较小,而给sprintf传递了一个很大的字符串就会发生缓冲区溢出,这样可能破坏堆栈,如果堆栈中返回地址被修改,那么精心构造的攻击数据可能让程序转入另一个数据区域,并且将那里的数据当成代码执行。如果这些代码不怀好意,那么就会破坏你的电脑为所欲为,所以叫不安全。

a123456678 2019-12-02 02:15:43 0 浏览量 回答数 0

回答

首先,这个程序是错误的,在exit()的时候会在stdout上发生竞争。你要明白,发生竞争之后出现什么情况都不稀奇,所以不要深究这个原因了,没有意义,这跟stdio的实现相关。举个可能的场景满足你的好奇心,比如:新线程的printf在写完缓冲区之后执行flush——调用write,再要把已经write过的数据从缓冲区中删掉,但是在删除之前,main线程的exit也要flush stdout,就可能把已经flush过的数据又flush了一遍。

a123456678 2019-12-02 02:41:25 0 浏览量 回答数 0

回答

首先,这个程序是错误的,在exit()的时候会在stdout上发生竞争。你要明白,发生竞争之后出现什么情况都不稀奇,所以不要深究这个原因了,没有意义,这跟stdio的实现相关。举个可能的场景满足你的好奇心,比如:新线程的printf在写完缓冲区之后执行flush——调用write,再要把已经write过的数据从缓冲区中删掉,但是在删除之前,main线程的exit也要flush stdout,就可能把已经flush过的数据又flush了一遍。

a123456678 2019-12-02 02:57:06 0 浏览量 回答数 0

问题

移动数据分析SDK log数据包的发送策略是什么?

猫饭先生 2019-12-01 21:52:59 1153 浏览量 回答数 0

问题

移动数据分析SDK log数据包的发送策略是什么?

猫饭先生 2019-12-01 21:54:11 843 浏览量 回答数 0

问题

安卓 json date类型数据

杨冬芳 2019-12-01 20:19:55 823 浏览量 回答数 1

问题

安卓 json date类型数据 出现错误!

爵霸 2019-12-01 20:04:50 936 浏览量 回答数 1

回答

Re数据库诊断报告中的“其它数据空间”是什么意思呢? 感谢TK的回答[ 处理意见 ] 您好,其它数据空间指的是mysql数据库的系统空间,包括事务日志文件(redo log)以及ibdata空间(包括InnoDB表的元数据信息,undo回滚段,doublewrite buffer双写缓冲),这部分空间占用3G左右,这是正常的,所有的RDS实例这部分空间都是占用3G左右。

八零杂音 2019-12-02 00:13:08 0 浏览量 回答数 0

回答

msg 没有release ?######1、ByteToMessageDecoder正常情况下会自动release,只是不知道为什么不工作了 2、如果手动release的话会报错,因为这个类是把里面的msg当容器用,不停接收新消息,复制到这个msg里面。这一次release掉,下一个消息就进不来了###### m###### 请先了解粘包断包,你这样写,不管来多少个字节,每次收到网络字节数据的时候你都是读一个4字节的int,高频率下字节缓冲区不停的堆积字节,但你也只是简单的读取了4字节的int。缓冲区是有最大容量的,你如果不做消费缓冲区满了就会出现你这种情况了。######打印messageLength有惊喜###### 哈哈,惊喜不断###### 每次消息包接收很多字节,你却只解析4字节,剩下的还存在缓冲区, 一积累,缓冲区爆了###### 解码写的有问题, buff 没清理

kun坤 2020-06-06 15:48:07 0 浏览量 回答数 0

问题

linux c:这个代码有什么问题?行读取和缓冲读取:报错

kun坤 2020-06-07 22:32:57 0 浏览量 回答数 1

问题

php中开启缓冲压缩 ob_start('ob_gzhandler') 之后是在什么时候开始的压缩?

落地花开啦 2019-12-01 20:05:47 1195 浏览量 回答数 1

问题

为什么串口在接受数据的时候 其余按键都不起作用了

a123456678 2019-12-01 20:06:22 992 浏览量 回答数 1

回答

一般对于大数据的读写操作,都会有一个cache层作为缓冲。一般选用cache的话,会用memcached或redis(还有一个阿里的cache)。然后再加上读写分离的策略。只要保证操作不会穿透cache,就没有什么问题。 当然是用cache的话,你要预估你的全部数据量或热数据量。预算好你的cache命中率。 你这里说道你们操作的集合数据,那选用redis就很不错了。redis本身就支持集合的操作。 最后一步就是cache中数据与持久数据的同步问题,这个你也是需要考虑的。 当然你说的你的数据要做汇集工作,这个就不是cache所不具备的功能了。redis支持服务端计算,如果的key设计的合理的话,估计也能解决你的数据汇集问题。

长安归故里. 2020-01-31 14:10:34 0 浏览量 回答数 0

问题

关于linux c语言多线程编程的问题

杨冬芳 2019-12-01 20:25:21 1031 浏览量 回答数 2

问题

laravel-monodb 多条写操作怎么优化

蛮大人123 2019-12-01 19:56:36 1031 浏览量 回答数 1

问题

在我的例子里,Linux的kernel与user space如何进行通信才好?

杨冬芳 2019-12-01 20:21:09 1022 浏览量 回答数 2

回答

从源码的实现上来说,in和out的确是有可能会出现溢出,但是出现的情况非常极端:每次读取数据的时候都比当前缓冲区中的数据还少、而且这种情况持续直到写入的数据超过4GB。通常应该是不会遇到的;鉴于墨菲定律可能带来的恶果,的确还是得考虑一下。 不过可以再想想,溢出了就真的会导致程序出错吗? 回头再仔细看看 __kfifo_put() 里面的代码,在写入的时候是这样实现的: /* first put the data starting from fifo->in to buffer end */ l = min(len, fifo->size - (fifo->in & (fifo->size - 1))); memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l); 注意 (fifo->in & (fifo->size - 1) 这里用了 & 符号,而不是直接 % fifo->size ,也就是说,初始化的时候size必然得设置成2的n次方(这个限制在内核里很合理,因为内核分配的空间通常是2的倍数,比如一个page)。 在像x86这种溢出跟取模操作等价的处理器上,对于当前的写入操作实际上“正好”没有风险。同样的,由于in/out都是 unsigned int ,在后续的 kfifo_get/kfifo_len 里面 in - out (比如说 2 - 4294967295,你可以试试),结果仍然“正好”是正确的。 结论就是,它居然真的没有风险(前提是在溢出、无符号整数减法操作与x86处理器类似的CPU上)。 不得不说,内核源码的开发者真吝啬啊,多写一个赋值操作都不舍得。 你既然都翻到源码了,为什么不仔细看看 kfifo_put() 的实现呢? 它调用的 __kfifo_put() 的代码足够解释了你的问题: __kfifo_put() 在写入之前会先比较待写入数据的长度和缓冲区的最大可写入长度,取其小者,写入,然后返回写入的数据长度。具体代码没几行,自己去看吧。

a123456678 2019-12-02 02:53:01 0 浏览量 回答数 0

问题

关于mina的setSendBufferSize奇怪之旅 400 请求报错

kun坤 2020-05-29 11:00:09 2 浏览量 回答数 1

回答

引用来自“chentian08”的答案 引用来自“中山野鬼”的答案 引用来自“Jack.arain”的答案 MP3一般是1152个采样为一帧来编码的,知道采样率,声道,很容易计算出1秒多少帧。一般音频播放缓冲搞个1秒左右就够了。 单纯解码mp3也可以试试  mpg123。。。 貌似楼主这些概念还没有。哈。我到现在还不清楚,为什么他是做解码,而从数据流中取了 1024 * 24bits。 刚接接触这方面的知识,确实不太了解,你有这方面的学习资料或例子什么的,能不能发点给我或者加我QQ:735838956@qq.com。其实我的目的就是,想做个拥有MP3播放器功能的东西,然后又跟网络有点关系,想实现的功能主要有:本地MP3文件的播放,这个有很多方法,但是具体怎么实现,我真的想知道,我就是想在发送数据的时候,同时把它播放出来,结果就出现了上面提到的问题了; 发送MP3文件,这个应该就是先读取一个大小,再发送; 接收MP3数据,然后播放,这个应该就是接受到数据后,解码播放; 我 00年搞AC3 DSP算法优化时,碰过音频,后来就没碰了。你要看资料,先看标准吧。标准理解清楚还是必要的。如果标准中很多俗语或名词搞不清楚,那你还需要补充知识。 ######回调函数用用还是应该的。应该是回调机制没处理好。需要有定时器。指定时间间隔,处理,填BUF。另一种可能,源码有BUG,如果源码没问题,不会占用那么高的CPU。音频解码占用的计算资源很少的。 ###### 引用来自“中山野鬼”的答案 回调函数用用还是应该的。应该是回调机制没处理好。需要有定时器。指定时间间隔,处理,填BUF。另一种可能,源码有BUG,如果源码没问题,不会占用那么高的CPU。音频解码占用的计算资源很少的。 如果是你,你会怎么做,因为这些音频数据还要通过网络发出,除了一帧帧地读,我想不出其它办法,刚接触音频开发,请指点。 ###### 引用来自“chentian08”的答案 引用来自“中山野鬼”的答案 回调函数用用还是应该的。应该是回调机制没处理好。需要有定时器。指定时间间隔,处理,填BUF。另一种可能,源码有BUG,如果源码没问题,不会占用那么高的CPU。音频解码占用的计算资源很少的。 如果是你,你会怎么做,因为这些音频数据还要通过网络发出,除了一帧帧地读,我想不出其它办法,刚接触音频开发,请指点。 应该是网络接入吧。如果是网络发送自然是编码后数据,不会是PCM数据。不过从你的描述很奇怪。只有PCM数据才需要 24bits,1024作为一个block,已备频域处理。 如果是我做,至少开1s的解码BUF。无非是采样率最多X4个bytes。你觉得大吗?哈。 ###### 引用来自“中山野鬼”的答案 引用来自“chentian08”的答案 引用来自“中山野鬼”的答案 回调函数用用还是应该的。应该是回调机制没处理好。需要有定时器。指定时间间隔,处理,填BUF。另一种可能,源码有BUG,如果源码没问题,不会占用那么高的CPU。音频解码占用的计算资源很少的。 如果是你,你会怎么做,因为这些音频数据还要通过网络发出,除了一帧帧地读,我想不出其它办法,刚接触音频开发,请指点。 应该是网络接入吧。如果是网络发送自然是编码后数据,不会是PCM数据。不过从你的描述很奇怪。只有PCM数据才需要 24bits,1024作为一个block,已备频域处理。 如果是我做,至少开1s的解码BUF。无非是采样率最多X4个bytes。你觉得大吗?哈。 什么叫1s的解码BUF。1s是什么意思? ###### 引用来自“chentian08”的答案 引用来自“中山野鬼”的答案 引用来自“chentian08”的答案 引用来自“中山野鬼”的答案 回调函数用用还是应该的。应该是回调机制没处理好。需要有定时器。指定时间间隔,处理,填BUF。另一种可能,源码有BUG,如果源码没问题,不会占用那么高的CPU。音频解码占用的计算资源很少的。 如果是你,你会怎么做,因为这些音频数据还要通过网络发出,除了一帧帧地读,我想不出其它办法,刚接触音频开发,请指点。 应该是网络接入吧。如果是网络发送自然是编码后数据,不会是PCM数据。不过从你的描述很奇怪。只有PCM数据才需要 24bits,1024作为一个block,已备频域处理。 如果是我做,至少开1s的解码BUF。无非是采样率最多X4个bytes。你觉得大吗?哈。 什么叫1s的解码BUF。1s是什么意思? 1s==1秒钟。后面我已经给出公式了。采样率 X 4 bytes。当然这是一个通道的容量。 ###### MP3一般是1152个采样为一帧来编码的,知道采样率,声道,很容易计算出1秒多少帧。一般音频播放缓冲搞个1秒左右就够了。 单纯解码mp3也可以试试  mpg123。。。######        99%是代码或者做法有bug. 这种任务量感觉非常的少. 应该被秒杀才对.  现在的CPU很霸气的. 给逻辑的每一步加时间输出,  定位耗时点.###### 引用来自“Jack.arain”的答案 MP3一般是1152个采样为一帧来编码的,知道采样率,声道,很容易计算出1秒多少帧。一般音频播放缓冲搞个1秒左右就够了。 单纯解码mp3也可以试试  mpg123。。。 貌似楼主这些概念还没有。哈。我到现在还不清楚,为什么他是做解码,而从数据流中取了 1024 * 24bits。 ###### 引用来自“中山野鬼”的答案 引用来自“Jack.arain”的答案 MP3一般是1152个采样为一帧来编码的,知道采样率,声道,很容易计算出1秒多少帧。一般音频播放缓冲搞个1秒左右就够了。 单纯解码mp3也可以试试  mpg123。。。 貌似楼主这些概念还没有。哈。我到现在还不清楚,为什么他是做解码,而从数据流中取了 1024 * 24bits。 刚接接触这方面的知识,确实不太了解,你有这方面的学习资料或例子什么的,能不能发点给我或者加我QQ:735838956@qq.com。其实我的目的就是,想做个拥有MP3播放器功能的东西,然后又跟网络有点关系,想实现的功能主要有:本地MP3文件的播放,这个有很多方法,但是具体怎么实现,我真的想知道,我就是想在发送数据的时候,同时把它播放出来,结果就出现了上面提到的问题了; 发送MP3文件,这个应该就是先读取一个大小,再发送; 接收MP3数据,然后播放,这个应该就是接受到数据后,解码播放;

kun坤 2020-06-06 23:55:47 0 浏览量 回答数 0

问题

内核kfifo.c中in和out的问题

a123456678 2019-12-01 19:43:47 791 浏览量 回答数 1

问题

内核kfifo.c中in和out的问题【已解决】

a123456678 2019-12-01 20:04:44 916 浏览量 回答数 1

问题

试用产品为什么是过期就立即释放?

扫落的黄叶 2019-12-01 21:13:25 3019 浏览量 回答数 4

回答

ReInnoDB需要安装这个东西吗 个人VPS或者单台服务器不要安装InnoDB,用不着,还浪费性能,特别是小内存VPS,白白增加内存开支。另外安装了InnoDB的MySQL比没安装的要多一些额外数据,你可以自己试试,在安装了InnoDB的VPS上安装一个WordPress,然后随便上几篇文章,或者直接把你的博客内容导入,然后将数据库导出,在没有安装InnoDB的机器上你导入数据库,然后你会发现什么? 数据库变小了? 根据我之前用WordPress做的实验,100篇文章,在安装了InnoDB的机器上,数据库大小为1.2M左右,而在没有安装InnoDB的机器上,只有0.65M左右,居然小了一半。 如果你的应用需要并发插入大量数据,例如:电子商务网站、银行系统、证券交易网站系统等等,那么启用InnoDB。 大家可以看看我的网站Mysql优化效果“老牛博客 ”,没有启用 InnoDB,用的USA的廉价VZ架构128M内存VPS,启用了Gzip和EA,未启用缓存,主要对Mysql配置文件做了一些修改,除开线路问题,打开速度飞快。 关于VPS或者云主机配置生产环境的时候需不需要安装InnoDB,更加详细的对比大家可以参照此文: MySQL数据库的InnoDB存储引擎是什么?需要安装InnoDB吗? 如何配置InnoDB提高数据库性能? 以下是官方英文翻译: nnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。 InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。 以下是一些知识: InnoDB在技术上是一套放在MySQL后台的完整数据库系统,它在主内存中建立其专用的缓冲池用于高速缓冲数据和索引,从而可以很有效的使用大量的内存。 InnoDB也有硬伤,比如它的磁盘性能就很令人担心,MySQL缺乏良好的tablespace真是天大的缺陷!如果你测试InnoDB下的Insert/Update/Remove性能绝对让你抓狂,Cache只能解决小数据量的问题,大数据量是不够的,没经历过导入几百万条InnoDB数据到最后看着文件尺寸100KB 100KB的增长,是没法体会痛苦的。 百万行记录插入之后,插入速度下降到了之前的1/30,从开始的1600行/秒衰退到50行/秒,同样的测试环境下,MyISAM没有这样的问题,InnoDB的Roadmap对此问题的时间表是“Long Term”。 MySQL InnoDB只有在满足以下条件下:不需要经常修改表结构,没有经常性的bulk insert和载入数据需求,在没有blob/text字段的前提下,index设置合理比如经常插入就减少 index, 经常查询就增加index,千万级别的插入速度和性能才能稳定。 如果大家对千万级别记录的表有经常的alter index, alter table, load data, bulk insert的需求,那最好可以选择其他存储引擎,当然也可以考虑使用其他数据库。

xiaohost.com 2019-12-01 23:23:07 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板