如何使用AVAssetWriter将h264流写入视频?

2024-05-24

我想将 h.264 流从服务器传输到视频文件,但是当我使用assetwrite.finishwrite,XCode 报告

Video /var/mobile/Applications/DE4196F1-BB77-4B7D-8C20-7A5D6223C64D/Documents/test.mov cannot be saved to the saved photos album: Error Domain=NSOSStatusErrorDomain Code=-12847 "This movie format is not supported." UserInfo=0x5334830 {NSLocalizedDescription=This movie format is not supported.}"

下面是我的代码: data是h.264帧,只是一帧,可能是i帧或p。

(void)_encodeVideoFrame2:(NSData *) data time:(double)tm 
{
  CMBlockBufferRef videoBlockBuffer=NULL;
  CMFormatDescriptionRef videoFormat=NULL;
  CMSampleBufferRef videoSampleBuffer=NULL;
  CMItemCount numberOfSampleTimeEntries=1;
  CMItemCount numberOfSamples=1;
  CMVideoFormatDescriptionCreate(kCFAllocatorDefault, kCMVideoCodecType_H264, 320, 240, NULL, &videoFormat);
  OSStatus result;
  result=CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault, NULL, data.length, kCFAllocatorDefault, NULL, 0, data.length, kCMBlockBufferAssureMemoryNowFlag, &videoBlockBuffer);
  result=CMBlockBufferReplaceDataBytes(data.bytes, videoBlockBuffer, 0, data.length);
  CMSampleTimingInfo videoSampleTimingInformation={CMTimeMake(tm*600, 600)};
  size_t sampleSizeArray[1];
  sampleSizeArray[0]=data.length;
  result=CMSampleBufferCreate(kCFAllocatorDefault, videoBlockBuffer, TRUE, NULL, NULL, videoFormat, numberOfSamples, numberOfSampleTimeEntries, &videoSampleTimingInformation, 1, sampleSizeArray, &videoSampleBuffer);
  result = CMSampleBufferMakeDataReady(videoSampleBuffer);
  [assetWriterInput appendSampleBuffer:videoSampleBuffer]; 
}

也许是CMSampleBufferCreate论证有误吗?谢谢。


为了复用已经压缩的 h264 缓冲区AVAssetWriter,你必须指定一个nilOutputSettings,与文档所述相反。

所以,而不是做

videoInput = [[AVAssetWriterInput alloc] 
    initWithMediaType:AVMediaTypeVideo outputSettings:@{
        AVVideoCodecKey: AVVideoCodecH264,
    }
    sourceFormatHint:myVideoFormat
];

你应该做

videoInput = [[AVAssetWriterInput alloc] 
    initWithMediaType:AVMediaTypeVideo
    outputSettings:nil
    sourceFormatHint:myVideoFormat
];

这将允许您传递视频或音频数据,而无需 AVAssetWriterInput 尝试为您编码/转码任何内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用AVAssetWriter将h264流写入视频? 的相关文章

随机推荐

  • 将设置类添加到 UWP 应用

    我正在开发通用 Windows 平台应用程序 但 Visual Studio 中没有设置模板 如何实现一个简单 强类型和可观察的类 将我的设置存储在 LocalSettings 或 RoamingSettings 中 创建一个继承自 Obs
  • 如何使用 Microsoft.Office.Interop.Word 将光标移动到特定段落?

    我们正在开发C Net 4 0基于 Windows 窗体的应用程序使用Microsoft Office Interop Word参考 现在我想将光标的位置移动到特定段落 我怎么做呢 void MoveToParagraph Microsof
  • 如何在 Symfony 2.1 中使用 ChoiceList?

    我有一个包含美国各州列表的文件 Alabama Alaska etc 在 symfony 2 0 中 我使用 ChoiceListInterface php 在我的表单中使用它 我简单地写了这个
  • MS Office 使用 WebDAV 以只读方式打开文档

    我们实现了自己的 WebDAV 服务器 某些使用 Office Word Excel 的用户以只读方式打开文档 对于有问题的计算机 接下来的查询是 OPTIONS http pastie org 10957339 http pastie o
  • addToBackStack 之后的 popBackStack() 不起作用

    我的项目包含两个片段 FragmentA 应用启动时默认加载的fragment FragmentB 替换fragmentA当单击按钮完成时 这是我的主视图的 XML
  • 为什么我不能“string”.print()?

    我的理解print 在 Python 和 Ruby 以及其他语言 中 它是字符串 或其他类型 上的方法 因为它的语法非常常用 打印 嗨 works 那么为什么不呢 hi print 在 Python 中或 hi print在红宝石工作 当你
  • 检测计算机是否可以正确支持 3D 变换

    当我检测到 webkit 时 我使用 3D Transforms 属性添加额外的样式表 尽管它在许多不同的计算机上运行良好 全部使用相同的 chrome 版本 有些无法正确渲染动画 这些是较旧的计算机 具有更便宜的显卡 我猜这就是导致问题的
  • 在 Spring 云中保护 Eureka

    我很好奇有哪些选项可以保护连接 注册和获取迪斯科信息 到尤里卡的服务 显然我想在 Eureka 中打开安全性并指定服务的用户名密码 我的一个问题是尝试连接到尤里卡的服务如何指定其凭据 是通过区域的规范吗 这个引用的格式是什么 我实际上是上述
  • Chrome 模拟设备的 OnePlus 3 和 OnePlus 5 视口尺寸

    我想将 OnePlus 3 和 OnePlus 5 作为自定义设备添加到 Google Chrome 的模拟设备列表中 请提供视口大小 以便我可以用它来测试我的网站 像素 2 显示尺寸示例 提前致谢 我正在寻找同样的东西 我发现了这个 ht
  • (Django) AJAX 请求的 CSRF 验证在 Chrome 中工作,但在 Firefox 中不起作用

    正如标题所述 我的 Django CSRF 验证在 Chrome 中有效 但在 Firefox 中无效 我想知道原因 以便解决此问题 我已将此包含在head我的标签基本 html我的应用程序中的所有其他文件都从中扩展的文件 base htm
  • Windows 服务在程序集加载时锁定

    我有一个用 C 编写的 Windows 服务 它还包括一个独立的控制台模式 用于调试目的 它在几乎每台运行它的计算机上都运行良好 但我们遇到了一种情况 当您尝试启动该服务时 它会锁定 然后由于超时而被终止 但是当在同一台机器上以控制台模式运
  • 使用 Mongoose 在 JSLint 中抑制“需要一个标识符,而是看到“默认”(保留字)”

    我在用着jshint验证我的 JavaScript 文件 在服务器端 我使用 Node js 和 Mongoose 在 Mongoose 中 我被鼓励以如下方式编写模式 var UserSchema new mongoose Schema
  • 如何在Windows命令行中执行for循环?

    我想知道这是否可能 我不熟悉使用 Windows 命令行 但我必须将它用于我正在处理的项目 我有许多文件 我需要为每个文件执行一个功能 我习惯使用 python 但显然这有点不同 所以我希望得到一些帮助 基本上 我需要 for 循环来迭代文
  • 如何阻止地址自动填充谷歌地点

    所以我在我的表单上有一个谷歌地图自动完成功能 当它到达一个位置时 它会占据该位置并格式化它 以便所有正确的信息都进入表单上的不同输入 我遇到的问题是在 place changed 事件触发自动完成填充输入之前 我想阻止最初的人口 而是填充我
  • 如何在 .Net Core 3、Visual Studio 2019 和 docker 中使用“dotnet watch run”

    我正在使用 Visual Studio 2019 来使用 docker 和 NET Core 3 我通过将 Dockerfile 添加到我的项目 右键单击项目 gt 添加 gt Docker 支持 来容器化我的应用程序 并且我能够启动它 但
  • 使用Python进行图像识别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个想法 就是我想识别图像中的字母 可能是 bmp或 jpg 例如 这是一个包含字母 S 的 bmp 图像 我想做的是使用Pyth
  • 模板、decltype 和非类类型

    我有一个像这样的函数定义 template
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • 引发一系列事件 Backbone event:name

    extend object Backbone Events object on myalert one function msg document body innerHTML eve1 msg msg name this name con
  • 如何使用AVAssetWriter将h264流写入视频?

    我想将 h 264 流从服务器传输到视频文件 但是当我使用assetwrite finishwrite XCode 报告 Video var mobile Applications DE4196F1 BB77 4B7D 8C20 7A5D6