当Emacs报告错误时,它总是显示具有缓冲区位置的代码,使用它很难找到确切单词所在的位置.
有没有办法知道缓冲区位置的确切行数?
我通过加载文件并通过FileInputStream> BufferedInputStream> DataInputStream方法将字节输入AudioTrack.write()来在我的Android手机上播放WAV.音频播放效果很好,如果是,我可以轻松调整采样率,音量等,性能良好.然而,一首曲目开始播放大约需要两秒钟.我知道AudioTrack有一个不可避免的延迟,但这太荒谬了.我每次播放曲目都会得到:
03-13 14:55:57.100: WARN/AudioTrack(3454): obtainBuffer timed out (is the CPU pegged?) 0x2e9348 user=00000960, server=00000000
03-13 14:55:57.340: WARN/AudioFlinger(72): write blocked for 233 msecs, 9 delayed writes, thread 0xba28
Run Code Online (Sandbox Code Playgroud)
我注意到,每次播放曲目时,延迟的写入次数会增加一次 - 即使是在多个会话中 - 从手机开机之时起.块时间始终为230 - 240ms,考虑到此设备上的最小缓冲区大小为9600(9600/44100),这是有意义的.我在互联网上的无数次搜索中看到了这个消息,但它通常似乎与不播放音频或跳过音频有关.就我而言,这只是一个延迟的开始.
我正在高优先级的线程中运行我的所有代码.这是我正在做的截断但功能正常的版本.这是我的播放类中的线程回调.再次,这是有效的(现在只播放16位,44.1kHz,立体声文件),它只需要永远启动并且每次都有获取缓冲/延迟写入消息.
public void run() {
// Load file
FileInputStream mFileInputStream;
try {
// mFile is instance of custom file class -- this is correct,
// so don't sweat this line
mFileInputStream = new FileInputStream(mFile.path());
} catch (FileNotFoundException e) {
// log
}
BufferedInputStream mBufferedInputStream …
Run Code Online (Sandbox Code Playgroud) 我是一位多年经验丰富的MFC程序员,近年来他一直在使用Objective C for Mac和iOS开发商业应用程序 - 我正在努力加快.Net和C#的速度(我很快就会这样做)需要将我的一个商业应用程序从Mac转换为PC).
我现在已经完成了几本书的练习,并且为了更熟悉.Net(和C#),我决定将我的一个非商业应用程序转换为.Net作为学习练习一切顺利(界面正常,数据结构都很好)但我需要能够播放音频.
我的Mac应用程序从一系列数学公式生成音频 - 想象一个波浪发生器 - 不完全相同但相似.在Mac上,我将音频生成为16位带符号的原始音频,使用Core Audio设置音频输出路由,然后在音频路由需要新的音频缓冲区时进行回调(这样我就可以动态生成音频) .
我需要在PC上做同样的事情.不幸的是,我发现MSDN文档是"无法看到树木"的案例,因为有大量的文档.我可以找到能让我加载和播放mp3/wav等文件的类,但我需要实时生成音频.任何人都可以指出我正确的方向找到一些东西,可以让我在播放时动态填充缓冲区吗?
谢谢
编辑:我发现seq_file
很容易从内核向用户空间写入大量数据.我正在寻找的是相反的; 一个API,便于从用户空间读取大量数据(多个页面).
编辑2:我正在实现一个<stdio.h>
作为内核模块的端口,它能够打开/proc
(以及后来的其他虚拟文件系统),类似于FILE
s并处理类似的输入和输出<stdio.h>
.你可以在这里找到这个项目.
我发现了很多关于内核如何将大量数据写入/ proc(用于用户空间程序)的问题,但没有其他方面.让我详细说明:
这个问题基本上是关于输入被标记化的算法(例如int
s或混合int
和字符串等),假设数据可能在多个缓冲区之间被打破.
例如,假设以下数据被发送到内核模块:
12345678 81234567 78123456 67812345 5678 1234 45678123 3456 7812 23456781
Run Code Online (Sandbox Code Playgroud)
并且为了这个例子,假设Linux提供/ proc处理程序的页面大小是20字节(相对于真正的4KB).
从/ proc(在内核模块中)读取数据的函数然后查看数据:
call 1:
"12345678 81234567 78"
call 2:
"123456 67812345 5678"
call 3:
" 1234 45678123 3456 "
call 4:
"7812 23456781"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,当78
在第一次调用中读取时,它应该在下一帧之前处理,以便它决定78
帧之间是整数还是一帧.
现在我发现seq_file
s显然只是在内核想要将数据写入用户而不是读取时(或者可能是HOWTO写得非常糟糕).
到目前为止,我已经提出了以下解决方案(我是从记忆中写的,所以我可能会错过几次错误检查,但请耐心等待):
在初始化阶段(比如说init_module …
我有一个缓冲区,想要做一个测试,看看缓冲区是否有足够的容量,我可以找到我可以添加到缓冲区的元素数量.
char *buffer = (char *)malloc(sizeof(char) * 10);
Run Code Online (Sandbox Code Playgroud)
做一个
int numElements = sizeof(buffer);
Run Code Online (Sandbox Code Playgroud)
不回10,有关如何实现这一点的任何想法?
如何在不复制和保留源std :: string对象的情况下获取std :: string char数据的所有权?(我想使用移动语义但在不同类型之间.)
基本上我想做一些与此相当的事情:
{
std::string s(“Possibly very long user string”);
const char* mine = s.c_str();
// 'mine' will be passed along,
pass(mine);
//Made-up call
s.release_data();
// 's' should not release data, but it should properly destroy itself otherwise.
}
Run Code Online (Sandbox Code Playgroud)
为了澄清,我确实需要摆脱std :: string:继续前进.该代码处理字符串和二进制数据,并应以相同的格式处理它.我确实想要来自std :: string的数据,因为它来自另一个与std :: string一起使用的代码层.
为了给出更多透视图,我想要这样做:例如,我有一个异步套接字包装器,它应该能够从用户那里获取std :: string和二进制数据进行写入.两个"API"写入版本(将std :: string或行二进制数据)内部解析为相同(二进制)写入.我需要避免任何复制,因为字符串可能很长.
WriteId write( std::unique_ptr< std::string > strToWrite )
{
// Convert std::string data to contiguous byte storage
// that will …
Run Code Online (Sandbox Code Playgroud) 所以我有一个功能,一直跳过第一个getline,直接跳到第二个getline.我试图清除缓冲区,但仍然没有运气,发生了什么?
void getData(char* strA, char* strB)
{
cout << "Enter String 1: "; // Shows this line
cin.clear();
cin.getline(strA, 50); // 50 is the character limit, Skipping Input
cout << endl << "Enter String 2: "; // Showing This Line
cin.clear();
cin.getline(strB, 50); // Jumps Straight to this line
}
Run Code Online (Sandbox Code Playgroud) 如何在nodejs中创建base64 JSON编码的字符串?
我尝试过这个并没有用.
var buff = new Buffer({"hello":"world"}).toString("base64");
Run Code Online (Sandbox Code Playgroud)
是这个吗?
var buff = new Buffer(JSON.stringify({"hello":"world"})).toString("base64");
Run Code Online (Sandbox Code Playgroud) 我正在使用ffmpeg从RTSP流处理一堆帧.我最终对这些帧进行了大量处理,这意味着我并不总是实时提取.如果缓冲区已满,则进程挂起.我想知道以下解决方案之一是否可行/解决问题,如果是,我将如何使用ffmpeg库实现它:
1)如果我到达悬挂点,有没有办法清除缓冲区?(我可以确定它何时挂起,我只是不知道该怎么做).
2)有没有办法让缓冲区覆盖旧数据,只是总是读取最新的数据?如果我丢帧,对我来说无关紧要.
3)我已经发现,我可以让缓冲区arbtrarily大:av_dict_set(&avd, "buffer_size", "655360", 0);
.这可能是一个解决方案,但我不知道它需要多大/多小,因为我不知道流将发布视频的时间有多长?
4)这只是我需要提出的ffmpeg人员的错误吗?
5)我没有考虑过的其他事情?
while(av_read_frame(context, &(packet)) >= 0 && fcount < fps*SECONDS) {
clock_t start, end;
int ret = avcodec_send_packet(codec_context, packet);
if(!(packet->stream_index == video_stream_index)) {
continue;
}
if (ret == AVERROR(EAGAIN) || ret == AVERROR(EINVAL)) {
continue;
} else if (ret < 0) {
cerr << "Error while decoding frame " << fcount << endl;
exit(1);
}
ret = avcodec_receive_frame(codec_context, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR(EINVAL)) {
continue;
} else …
Run Code Online (Sandbox Code Playgroud) Run Code Online (Sandbox Code Playgroud)pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
效果:让我们来
width
表示a_codecvt.encoding()
.如果is_open() == false
,或者off != 0 && width <= 0
,则定位操作失败.否则,如果way != basic_ios?::?cur
还是off != 0
,如果最后的操作是输出,然后更新输出序列和写任何不印字序列.接下来,寻找新的位置:如果width > 0
,打电话fseek(file, width * off, whence)
,否则打电话fseek(file, 0, whence)
.
它没有提到此函数更新输入序列.作为对比,seekpos
确实更新输入序列:
Run Code Online (Sandbox Code Playgroud)pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out) override;
如果可能,改变文件位置以对应存储的位置
sp
(如下所述).更改文件位置执行如下:
if
(om & ios_base?::?out) != 0
,然后更新输出序列并写入任何非移位序列;将文件位置设置
sp …