【问题标题】:AVAssetReader, how to use with a stream rather than a file?AVAssetReader,如何与流而不是文件一起使用?
【发布时间】:2018-12-15 19:08:59
【问题描述】:

AVAssetReader 很棒,但我只能看到如何将它与本地资产、文件或我猜的组合一起使用,

所以,

assetReader = try AVAssetReader(asset: self.asset)
...
assetReader.addOutput(readerOutput)

等等,

假设你有一个到达的流

(可能是 Apple 的 .M3U8 文件示例,

https://developer.apple.com/streaming/examples/)

实际上,AVAssetReader 可以用于流吗?还是只有本地文件?

我只是在任何地方都找不到这个解释。 (如果您更熟悉它,也许会很明显。:/)

【问题讨论】:

    标签: ios swift avfoundation avassetreader


    【解决方案1】:

    这并不明显。将 AVAssetReaderAVComposition 的头文件 cmets 一起修补会给人留下强烈的印象,即 API 仅为本地资产设计,尽管该语言并未明确排除非本地资产。

    来自AVAssetReader 头文件:

    AVAssetReader 的实例从 AVAsset 的实例读取媒体数据,无论资产是基于文件的还是表示来自多个来源的媒体数据的组合,就像 AVComposition 一样。

    来自AVComposition

    AVComposition 将来自多个基于本地文件的来源的媒体数据以自定义的时间安排组合在一起,以便一起呈现或处理来自多个来源的媒体数据。无论容器类型如何,所有基于本地文件的视听资产都可以合并。

    如果您只对视频感兴趣,并且不介意将处理作为播放的一部分,您可以通过将AVPlayerItemVideoOutput 添加到您的AVPlayerItem 来从远程资产中捕获帧。如果您对音频感兴趣,那您就上岸了。

    【讨论】:

    • 知道了。太棒了,谢谢。我认为那真的只适用于文件。是的,我的目标是相当“简单”(1)获得一个 H264 的流式传输(例如,.ts)流。 (2) 分成不同的(比如 2 或 3 个)流。每个流都被硬件解码(所以,基本上是 VTDecompression)。真的就是这样!我担心 AVAssetReader 虽然会容易得多,但可能不是答案。
    • 我已经得出结论,真正做到这一点的唯一方法是 (A) 获取流 (B) 基本上使用此过程.. stackoverflow.com/questions/29525000 .. 打包流准备好VTDecompression,(C)发送到VTDecompression,就是这样,使用原始帧。真的“B”是我猜的敏感部分。我必须承认我对如何仅做“A”有点难过! :) 但是周围有几个例子,比如 gityhub/Avois,所以,它走到了一起:O 我希望用 AVAssetReader 找到一个便宜的简单解决方案 :)
    • 附注我所说的并不完全正确:一些远程资产确实AVAssetReader 一起工作,但您必须先将它们包装在AVComposition 中。远程 mp4 对我有用,但 m3u8 没有。这个事实可以大大简化你的(B)。 (A) 还不错,m3u8 文件只是(最终)指向 mp4s(或其他东西)的文本文件。这个github.com/shogo4405/HaishinKit.swift 中可能有一些指针
    • 令人着迷,我将对此进行探讨。极好的。有趣的事情 - 就我而言,我已经走上了从头开始编译 ffmpeg 到 iOS 应用程序的道路,然后.. 只是从头开始用 ffmpeg 编写我自己的。
    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 2020-10-19
    • 2019-06-18
    • 2016-08-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多