我正在编写一个iPhone应用程序,使用AVFoundation从相机创建静态图像.阅读编程指南我发现了一个几乎我需要做的代码,所以我试图"逆向工程"并理解它.
我发现在理解将CMSampleBuffer转换为图像的部分时遇到了一些困难.
所以这是我理解的,后来是代码.
CMSampleBuffer表示存储器中存储有附加数据的图像的缓冲区.后来我调用函数CMSampleBufferGetImageBuffer()来仅使用图像数据接收CVImageBuffer.
现在有一个我不理解的功能,我只能想象它的功能:CVPixelBufferLockBaseAddress(imageBuffer,0); 我无法理解它是否是一个"线程锁",以避免对它进行多次操作或锁定缓冲区的地址,以避免在操作期间发生变化(为什么要更改?...另一帧,不是数据被复制在另一个地方?).剩下的代码对我来说很清楚.
试图在谷歌上搜索但仍然没有找到任何帮助.
有人可以带点光吗?
-(UIImage*) getUIImageFromBuffer:(CMSampleBufferRef) sampleBuffer{
// Get a CMSampleBuffer's Core Video image buffer for the media data
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer, 0);
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
// Get the number of bytes per row for the pixel buffer
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
// Get the pixel buffer width and height
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
// Create a device-dependent RGB color …Run Code Online (Sandbox Code Playgroud) 在我正在开发的应用程序中,我想让用户选择视频录制的分辨率.由于规范,我不能使用AVCaptureSessionPreset常量.
获取格式列表的分辨率高于3000px,当然不能用于视频抓取,但仅适用于照片拍摄.
AVCaptureDeviceFormat:0x17020c830'vide'/'420f'3264x2448,{2- 30 fps},HRSI:3264x2448,fov:58.040,max zoom:153.00(upscales @ 1.00),AF系统:2,ISO:29.0-1856.0,SS: 0.000013-0.500000
我找不到一种方法来查看特定格式是否适合视频录制.
问题是,如果我尝试抓取视频,使用这种解决方案应用程序会生成一个异常,表示没有活动或启用的连接.
- [AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] - 没有活动/启用的连接.
我也不想对每种设备进行硬编码限制.
我也不能试图限制上限,AVCaptureSessionPresetHigh因为Apple注释中所述的不是实际的最大格式.
有没有办法了解AVCaptureDeviceFormat是否适合抓取视频?
我有一个应用程序(只有ios5),在方法内部声明一个在块内使用的弱变量来引用一个视图控制器的实例.
QRCodeViewController * __weak weakSelf = self;
Run Code Online (Sandbox Code Playgroud)
问题是编译器显示警告说:
无法在自动变量上指定__weak属性
在那个应用程序中我使用了很多弱引用,我从来没有看过这样的警告,与其他类的唯一区别是这个类是在.mm文件中实现的,因为它使用了c ++对象而项目无法编译如果我把它留作.m.
我必须说代码似乎工作正常.
有什么建议吗?
weak-references objective-c objective-c++ ios automatic-ref-counting
在我的应用程序中,我从单个图像创建视频.一切正常,视频组装正确,大小和方向正确.它们在Apple照片应用程序,MPMoviePlayer和我保存它们的沙箱目录中都能正确显示.
当我试图从电影中获取拇指时出现问题.方向不正确,我不知道如何解决,我已经看到有一个 - preferredTransform属性,但结果是景观和肖像视频相同.
我正在使用的URL是沙箱目录路径.这是片段:
- (void) setVideoPath:(NSString *)videoPath {
if (videoPath ==_videoPath) {
return;
}
_videoPath = videoPath;
AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:_videoPath]];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
CMTime time = CMTimeMake(1, 1);
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
self.videoImageView.image = thumbnail;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试找到这种情况的解决方法:
我有一个UITabBarController它的一个segue连接到一个容器视图控制器(BannerViewController),我用来嵌入一个UINavigationController,导航控制器推送其他容器视图控制器(EventListContainerviewController) )每个都包含一个tableview控制器.
这是我的故事板上的一个屏幕

问题是最后一个容器视图显示在一个比它们的容器更小的框架中.它们似乎松动了底部的tabbar空间.
我强制所有视图控制器,导航控制器和tabbar控制器都避免不扩展边缘并调整插入.
颜色意味着:
红色:BannerContainerViewController的主视图0x7fcc6d38bb00
浅绿色:BannerContainerViewController 的容器视图0x7fcc6d38b860蓝色:EventListContainerViewController的主视图0x7fcc6bd7b7c0
橙色:EventListContainerViewController 的容器视图0x7fcc6bd7b690
当导航控制器添加蓝色容器视图时,似乎某些东西会发生变化,从而减少相同数量的tabbar(49pt).它也可以在视图层次结构的递归描述中看到:
<UIWindow: 0x7fcc6bd5af40; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7fcc6bd4dd80>; layer = <UIWindowLayer: 0x7fcc6bd317c0>>
| <UILayoutContainerView: 0x7fcc6bd671c0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fcc6bd66de0>>
| | <UITransitionView: 0x7fcc6bd6a980; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x7fcc6bd6ace0>>
| | | <UIViewControllerWrapperView: 0x7fcc6d3a7b20; frame = (0 0; 320 568); autoresize = W+H; …Run Code Online (Sandbox Code Playgroud)
我试图找到一个很好的解决方案,将一个字典数组拆分成一个较小的字典,并以它们之间的公共值为键.
这是一个我JSON的例子,我从这开始:
{
"field": [
{
"id": 6,
"name": "Andrea"
},
{
"id": 67,
"name": "Francesco"
},
{
"id": 8,
"name": "Maria"
},
{
"id": 6,
"name": "Paolo"
},
{
"id": 67,
"name": "Sara"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想得到一个结果:
{
"field": [
{
"6": [
{
"name": "Andrea",
"id": 6
},
{
"name": "Paolo",
"id": 6
}
],
"67": [
{
"name": "Sara",
"id": 67
},
{
"name": "Francesco",
"id": 67
}
],
"8": [
{
"name": "Maria",
"id": 8
} …Run Code Online (Sandbox Code Playgroud) 我有一个有 3 个目标的应用程序:
我正在尝试更新每个构建的构建号,所有目标的这个数字必须相等,否则 App Store 将使构建无效。
我尝试过不同的方法,这也是一个,但我不喜欢它,因为我必须硬编码的plist文件名称到脚本,而我更愿意把它尽可能通用。
在寻找不同的解决方案时,我从 Apple 找到了这个名为avgtool 的工具。
我能够创建一个脚本,为所有目标以相同的值更新内部版本号,但这似乎只有当我将它添加到列表顶部的构建阶段时才有效。问题是这个脚本必须在构建之前启动。
为此,必须将其添加到Edit Scheme->Build->Pre-Actions 但是当我在这里写它时,它没有任何效果。
#!/bin/bash
buildNumber=$(date +%s)
echo "$buildNumber"
xcrun agvtool new-version -all "$buildNumber"
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过使用 Core Image 的金属着色语言CIFilter从该源移植一些内容。
我有一个由结构数组组成的调色板RGB,我想将它们作为参数传递给自定义 CI 彩色图像内核。
RGB 结构体被转换为SIMD3<Float>.
static func SIMD3Palette(_ palette: [RGB]) -> [SIMD3<Float>] {
return palette.map{$0.toFloat3()}
}
Run Code Online (Sandbox Code Playgroud)
内核应该采用simd_float3值数组,问题是当我启动过滤器时,它告诉我索引 1 处的参数需要一个NSData.
override var outputImage: CIImage? {
guard let inputImage = inputImage else
{
return nil
}
let palette = EightBitColorFilter.palettes[Int(inputPaletteIndex)]
let extent = inputImage.extent
let arguments = [inputImage, palette, Float(palette.count)] as [Any]
let final = colorKernel.apply(extent: extent, arguments: arguments)
return final
}
Run Code Online (Sandbox Code Playgroud)
这是内核:
float4 eight_bit(sample_t image, …Run Code Online (Sandbox Code Playgroud)
使用惊人的GPU图像框架,我正在尝试使用自定义片段着色器创建自定义过滤器,该着色器将一些颜色向量作为制服传递,详细说明每个片段用制服中的一个替换选择的颜色.我使用Quartz制作它并且它可以工作,但是由于我正在使用这个框架在OpenGL世界中迈出第一步,所以我想尝试GPU处理.
我制作的片段着色器似乎工作正常,但输出中存在问题.我发布了一个调试海豚的样本
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
bool compareVectors (lowp vec3 x,lowp vec3 y){
bool result;
if (x.r != y.r) {
return result = false;
}
if (x.b != y.b) {
return result = false;
}
if (x.g != y.g ) {
return result = false;
}
return result = true;
}
void main()
{
lowp vec3 tc = vec3(0.0, 0.0, 0.0);
lowp vec4 pixcol = texture2D(inputImageTexture, textureCoordinate).rgba;
lowp vec3 sampleColors[3];
lowp vec3 newColors[3];
sampleColors[0] = vec3(0.2, 0.2, …Run Code Online (Sandbox Code Playgroud) 有一件事让我对自动布局感到疯狂,我正在进行测试,并发现如果你继承UIView并且你用一些约束放置一些视图就不可能知道计算值.
不要说我们有一个继承的TestViewClass UIView,我们内部有一些子视图.我们想将它用于iPhone和iPad,所以我们使用两种尺寸,假设100x100和200x200我们制约了一切,使一切正常.我们构建此视图将这些子视图放在某些位置.
现在我们需要构建另一个子视图,其中包含许多按钮作为子视图(contentView),这些按钮在运行时给出.
算法将选择此内容视图的大小,并按正确数量的按钮计算它们之间的空间,使得它们彼此之间的距离相同但覆盖整个内容视图宽度.例如,contentView的宽度为200磅,按钮为3,边长为60.它们一起覆盖180,因此我们剩下20个点,应该作为按钮之间的空间 - > 10个点.
这很简单,在自动布局之前已经成千上万次.要做到这一点,我需要contentView的宽度,它的超级视图有一些限制,使其根据超视图大小调整其宽度,问题是我找不到UIView实现中的任何地方,我可以得到最终值contentView的大小.
我试过看-layoutSubviews,-updateConstraints,-didMoveToSuperview,值显示时总是有原来的一个.计算新帧时?
我显然没有得到关于自动布局的东西......
我发现这个问题试图设置表视图单元格高度,试图使它们在表格视图的大小独立显示在屏幕上.这是相关问题的其他问题
ios ×8
objective-c ×3
avfoundation ×2
iphone ×2
arrays ×1
autolayout ×1
avasset ×1
bash ×1
build-script ×1
capture ×1
cifilter ×1
cocoa ×1
core-image ×1
gpuimage ×1
image ×1
ios4 ×1
macos ×1
metal ×1
metalkit ×1
opengl-es ×1
sorting ×1
split ×1
uitableview ×1
video ×1
xcode ×1
xcode8 ×1