【问题标题】:Reading a .mov file with NSInputStream while writing with AVCaptureMovieFileOutput在使用 AVCaptureMovieFileOutput 写入时使用 NSInputStream 读取 .mov 文件
【发布时间】:2013-06-29 13:23:40
【问题描述】:

目标: 使用AVCaptureMovieFileOutput 将视频录制到 .mov 文件中。在录制视频时,我想将其上传到 S3。上传部分应该是可行的多部分上传。 (Mac OS X +10.8 应用)

问题: 如何在使用 AVCaptureMovieFileOutput 写入文件并增大大小的同时从块中读取 .mov 文件?

到目前为止我做了什么:

// session = AVCaptureSession with audio and video inputs

fileOutput = [[AVCaptureSession alloc] init];
[session addOutput:fileOutput]

[session startRunning]
[fileOutput startRecordingToOutputFileURL: fileUrl recordingDelegate:self]

// In async dispatch queue
inputStream = [NSInputStream inputStreamWithFileAtPath:fileUrl]
// schedule in run loop, open and run

此时我开始在带有NSStreamEventHasBytesAvailable 的委托对象上接收stream:handleEvent: 消息。但几秒钟后,消息停止进入(在总字节数为 250.000-300.000 字节 (0.2MB) 之后)即使 .mov 文件的大小增长到 >10MB,也会发生这种情况。

问题:

  1. 为什么NSInputStream 委托不能继续接收流事件?

  2. 最初可用的数据是否不可靠?

  3. 这总体上是一种可行的方法吗?还是有其他方法可以实现我想要的?

谢谢!

【问题讨论】:

  • 您找到解决方案了吗? @乔纳斯

标签: objective-c cocoa avfoundation nsinputstream


【解决方案1】:

我在http://www.gdcl.co.uk/2013/02/20/iOS-Video-Encoding.html 有一个示例,它在从相机录制到文件时从电影文件中读取(iOS 6)。我正在使用单独的 AVAssetWriter,但看起来这对您来说应该可以正常工作。

【讨论】:

  • 感谢您的意见,Geraint。在您提到的文章中,文件中不包含任何音频。在我的情况下,文件中记录了音频。这样就不可能了?谢谢
  • 如果您只想在录制时复制文件,我认为应该没问题。你不需要解释它,只需复制已经写好的部分。但是您需要小心:当文件关闭时,mdat 块的大小将被更新。大多数情况下,文件应该按顺序写入。我的示例展示了如何在编码时使用编码的视频数据:为此,您需要单独编写音频(也许自己重新混音,仅使用硬件进行视频编码)。
  • 好的,如果我理解正确,您的代码示例(虽然很有趣)不是那么相关?我需要将 .mov 文件的完整副本写入磁盘。您专注于将视频流式传输到另一个单元?
  • 您的观点:在写入 MOV 文件时读取它似乎不起作用。我的观点:出于其他原因,我的代码正是这样做的,因此您可以查看差异(或要求我这样做)并了解为什么您的失败而我的失败。可能的区别:我使用单独的捕获会话和资产编写器,而您使用组合对象。我只写视频,而你在写音频和视频。
猜你喜欢
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2015-07-26
  • 2010-10-09
相关资源
最近更新 更多