我制作了一个视频播放器,用于分析当前正在播放的视频中的实时音频和视频轨道.视频存储在iOS设备上(在Apps Documents目录中).
一切正常.我使用MTAudioProcessingTap来获取所有音频样本并进行一些FFT,我只是通过从当前播放的CMTime(AVPlayer currentTime属性)中复制像素缓冲区来分析视频.正如我所说,这很好.
但现在我想支持Airplay.只是airplay本身并不困难,但是一旦Airplay被切换并且视频正在ATV播放,我的水龙头就会停止工作.不知何故,MTAudioProcessingTap将不会处理,像素缓冲区全部为空......我无法获取数据.
有没有办法获得这些数据?
为了获得像素缓冲区,我只需每隔几毫秒触发一个事件并检索播放器的currentTime.然后:
CVPixelBufferRef imageBuffer = [videoOutput copyPixelBufferForItemTime:time itemTimeForDisplay:nil];
CVPixelBufferLockBaseAddress(imageBuffer,0);
uint8_t *tempAddress = (uint8_t *) CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
Run Code Online (Sandbox Code Playgroud)
tempAddress我的pixelbuffer 在哪里,videoOutput是一个实例AVPlayerItemVideoOutput.
对于音频,我使用:
AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
// Create a processing tap for the input parameters
MTAudioProcessingTapCallbacks callbacks;
callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
callbacks.clientInfo = (__bridge void *)(self);
callbacks.init = init;
callbacks.prepare = prepare;
callbacks.process = process;
callbacks.unprepare = unprepare;
callbacks.finalize = finalize;
MTAudioProcessingTapRef tap;
OSStatus err …Run Code Online (Sandbox Code Playgroud) 我目前正在研究一个ruby应用程序,但它运行得非常(非常!)慢..直到现在,我已经尝试了一些事情,我可以将其缩小到主要问题:Ruby正试图寻找它的需要在$ LOAD_PATH中的每个目录中.
基本上我正在观察的是,ruby正在查看大量文件,试图查看是否需要存在.如果它找不到它们,它将进入下一个目录.好消息是我可以看到这种情况发生在strace上.有很多这样的输出:
open("/boa_proj_build/nsteen/.gem/gems/i18n-0.7.0/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/boa_proj_build/nsteen/.gem/gems/thread_safe-0.3.5/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/boa_proj_build/nsteen/.gem/gems/tzinfo-1.2.2/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/boa_proj_build/nsteen/.gem/gems/minitest-5.8.2/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/boa_proj_build/nsteen/.gem/gems/activesupport-4.2.4/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/boa_proj_build/nsteen/.gem/gems/climate_control-0.0.3/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/boa_proj_build/nsteen/.gem/gems/cocaine-0.5.7/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/boa_proj_build/nsteen/.gem/gems/boa_loggable-0.2.2/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT …Run Code Online (Sandbox Code Playgroud) 我正在为iPad上的应用程序工作,我想分析我正在播放的视频中的音频.使用MTAudioProcessingTap一切顺利.目前我有一些测试代码来测试/测量左右声道的音量.这一切都很顺利:
void process(MTAudioProcessingTapRef tap, CMItemCount numberFrames,
MTAudioProcessingTapFlags flags, AudioBufferList *bufferListInOut,
CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut)
{
OSStatus err = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut,
flagsOut, NULL, numberFramesOut);
if (err)
NSLog(@"Error from GetSourceAudio: %ld", err);
float leftVolume, rightVolume;
for (CMItemCount i = 0; i < bufferListInOut->mNumberBuffers; i++)
{
AudioBuffer *pBuffer = &bufferListInOut->mBuffers[i];
int cSamples = numberFrames * pBuffer->mNumberChannels;
float *pData = (float *)pBuffer->mData;
float rms = 0.0f;
for (int j = 0; j < cSamples; j++)
{
rms += pData[j] * pData[j];
}
if …Run Code Online (Sandbox Code Playgroud) 我有 2 个表,Customers并且Countries,像这样:
顾客:
+----+------+-----+---------------+----------------+
| ID | Name | ... | OfficeCountry | BillingCountry |
+----+------+-----+---------------+----------------+
| 1 | Bill | ... | 1 | 1 |
| 2 | Joe | ... | 2 | 1 |
+----+------+-----+---------------+----------------+
Run Code Online (Sandbox Code Playgroud)
国家:
+----+-------------+
| ID | Name |
+----+-------------+
| 1 | USA |
| 2 | Netherlands |
+----+-------------+
Run Code Online (Sandbox Code Playgroud)
(我从表中删除了一些列,Customers只保留了该问题的一些相关列)这两列的目的是计费国家/地区和物理办公地点可能不同。该表中还有更多地址信息,但在本示例中被删除。
我JOIN对这两个表进行查询,结果如下:
SELECT
ID,
some,
fields,
Countries_1.Name AS OfficeCountryName,
Countries_2.Name AS BillingCountryName
FROM …Run Code Online (Sandbox Code Playgroud) 我正在尝试为iOS创建一个视频播放器,但有一些额外的音轨阅读.我一直在检查MPVideoPlayerController,以及AV基金会的AVPlayer,但它有点模糊.我想要做的是播放视频(来自本地.mp4),当电影播放时获取当前音频缓冲区/帧,所以我可以做一些计算和其他(不是视频/音频相关)动作在当前播放的音频上.这意味着视频应该继续播放,其音频轨道,但我也想要实时原始音频数据进行计算(例如:获取特定频率的振幅).
有没有人有这样做的例子或提示?当然,我查看了Apple的AV Foundation库文档,但对我来说还不够清楚.
像这样加载 AVAsset 后:
AVAsset *asset = [AVAsset assetWithURL:url];
Run Code Online (Sandbox Code Playgroud)
我想知道音频轨道的采样率是多少。目前,我得到这样的音轨:
AVAssetTrack *audioTrack = [[asset tracksWithMediaCharacteristic:AVMediaCharacteristicAudible] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
哪个有效。但是我似乎找不到任何类型的属性,即使在使用 Google 之后也找不到 ;-) ,这给了我采样率。这如何正常工作?甚至有可能吗?(我开始越来越怀疑,因为谷歌搜索并没有给我很多信息......)
是否有可能 - 在PHP中 - "禁用"覆盖类的构造函数的功能?
只是为了使场景清晰:我有一个抽象类A,带有构造函数.这个构造函数对于类的工作是必不可少的.然后我有一些"兄弟姐妹","扩展"抽象类A.他们 - 有意识地 - 必须扩展该类,但我不希望他们触及构造函数.
我知道可以调用parent :: __ construct(),但这样我就不会强制使用该模式.在我的同事正在实施扩展我的抽象类的新类的情况下,我不希望没有混淆.当然,所有内容都记录在案,但是你们都知道在阅读内容时它会如何发展;-)
关于如何禁用构造函数的覆盖的任何想法?(在这种情况下,我会创建一个可以覆盖的抽象init()方法,但是我的"抽象构造函数"将对其进行调整).或者任何其他想法来实现这种想要的情况?
谢谢!NIEK
ios ×4
avfoundation ×3
core-audio ×2
airplay ×1
audio ×1
measurement ×1
ms-access ×1
mysql ×1
odbc ×1
oop ×1
overriding ×1
php ×1
real-time ×1
ruby ×1
sql ×1
video ×1