相关疑难解决方法(0)

从UIImages数组创建视频并将视频保存到iPhone库.AVAssetLibrary + AVFoundation

将视频保存到iPhone库时出现问题.我有一个UIImages数组,还有两个按钮,"convertToVideo"和"saveToiPhoneLib"


-(IBAction) convertToVideo
{
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

 NSString *documentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;

NSString *savedVideoPath = [documentsDirectory stringByAppendingPathComponent:@"videoOutput"];

printf(" \n\n\n-Video file == %s--\n\n\n",[savedVideoPath UTF8String]);

[self writeImageAsMovie:imageArray toPath:savedVideoPath size:self.view.frame.size duration:3];
}


here i'm passing the imageArray and savedVideoPath to the function below


-(void)writeImageAsMovie:(NSArray *)array toPath:(NSString*)path size:(CGSize)size duration:(int)duration 
{

 NSError *error = nil;

 AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
          [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie
                 error:&error];


 NSParameterAssert(videoWriter);

 NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
           AVVideoCodecH264, AVVideoCodecKey,
           [NSNumber numberWithInt:size.width], AVVideoWidthKey, …

export avfoundation uiimage ios4 avassetwriter

14
推荐指数
2
解决办法
1万
查看次数

带有 BT.709 矩阵的 H.264 编码视频是否包括任何伽马调整?

我已经多次阅读BT.709 规范,但不清楚的是,编码的 H.264 比特流是否应该将任何伽马曲线应用于编码数据?请注意 BT.709 规范中对类似伽马公式的具体提及。Apple 提供了从 CoreVideo 读取 YUV 数据的 OpenGL 或 Metal 着色器示例,提供的缓冲区不进行任何类型的伽马调整。YUV 值正在被读取和处理,就好像它们是简单的线性值一样。我还检查了 ffmpeg 的源代码,发现在 BT.709 缩放步骤之后没有应用伽马调整。然后我创建了一个测试视频只有两种线性灰度颜色 5 和 26 对应于 2% 和 10% 的级别。当使用 ffmpeg 和 iMovie 转换为 H.264 时,输出 BT.709 值是 (YCbCr) (20 128 128) 和 (38 128 128) 并且这些值与 BT.709 转换矩阵的输出完全匹配,没有任何伽马调整。

可以在Quicktime Gamma Bug 中找到有关此主题的大量背景资料。似乎 Quicktime 和 Adob​​e 编码器的一些历史问题不正确地进行不同的伽马调整,结果使视频流在不同的播放器上看起来很糟糕。这确实令人困惑,因为如果与sRGB进行比较,它清楚地表明如何应用伽马编码,然后对其进行解码以在 sRGB 和线性之间进行转换。如果在创建 h.264 数据流时在矩阵步骤之后没有应用伽马调整,为什么 BT.709 会详细介绍相同类型的伽马调整曲线?h.264 流中的所有颜色步骤是否都应编码为直线(伽马 1.0)值?

如果特定的示例输入会使事情更清楚,我附上了 3 个颜色条图像,不同颜色的确切值可以显示在带有这些图像文件的图像编辑器中。

第一个图像在 sRGB 色彩空间中,并被标记为 sRGB。

sRGB色彩空间

第二张图像已转换为线性 RGB …

video ffmpeg ios metal

7
推荐指数
1
解决办法
3227
查看次数

如何使用 AVAssetWriter 将 colorProfile 添加到使用 CGDisplayStream 从屏幕录制的视频中

我编写了一个屏幕录制应用程序,它使用 VideoToolbox 和 AVWriter 写出 H.264 电影文件。与原始屏幕相比,录制文件中的颜色有点暗淡。我知道这是因为 colorProfile 未存储在视频文件中。

这与如何对 AVAssetWriter 输出进行颜色管理密切相关

我创建了一个测试台来在 github ScreenRecordTest上展示这一点

如果您运行此应用程序,您可以使用 CMD-R 开始录制并使用相同的 CMD-R 停止录制(您必须开始和停止录制一次才能获得完整写入的电影文件)。您将在 /tmp/ 文件夹中找到类似以下名称的录音:“/tmp/grab-2018-10-25 09:23:32 +0000.mov”

录制时,应用程序会显示两个实时图像:a)从 CGDisplayStream 获取的帧 - 和 - b)来自压缩器的 cmSampleBuffer。

我发现从 CGDisplayStream 返回的 IOSurface 没有进行颜色管理,因此您会注意到压缩之前已经出现“暗淡”颜色。如果您取消 AppDelegate.swift 中第 89 行的注释

// cgImage = cgImage.copy(colorSpace: screenColorSpace)!
Run Code Online (Sandbox Code Playgroud)

此实时预览将具有正确的颜色。现在这仅用于显示压缩前的 IOSurface。我不知道如何使其他实时预览(压缩后)(AppDelegate 中的第 69 行)显示正确的颜色(例如:如何将 colorProfile 应用于 CMSampleBuffer),或者最重要的是如何使用正确的配置文件,以便在打开 .mov 文件时我在播放时获得正确的颜色。

macos avfoundation avassetwriter video-toolbox

5
推荐指数
0
解决办法
315
查看次数