c++ - 是否有可以在 iOS 上运行的 API 来更改现有视频的每秒帧数?
问题描述
我正在寻找一种方法来接收任何视频(iOS 支持)作为输入,并以新的每秒帧速率在设备上保存一个新视频。动机是减小视频大小,并使其尽可能轻。
- 尝试从命令行使用 ffmpeg 库(需要它直接从应用程序运行)
- 尝试使用 SDAVAssetExportSessionDelegate,但仅设法改变每秒位数(每个帧质量较低)
虽然可以使用 OpenCV - 但如果可能的话,更喜欢更轻的和内置的东西
目标 C:'''
compressionEncoder.videoSettings = @ { AVVideoCodecKey: AVVideoCodecTypeH264, AVVideoWidthKey: [NSNumber numberWithInt:width], //Set your resolution width here AVVideoHeightKey: [NSNumber numberWithInt:height], //set your resolution height here AVVideoCompressionPropertiesKey: @ { AVVideoAverageBitRateKey: [NSNumber numberWithInt:bitRateKey], // Give bitrate for lower size low values AVVideoProfileLevelKey: AVVideoProfileLevelH264High40, // Does not change - quality setting and not reletaed to playback framerate! //AVVideoMaxKeyFrameIntervalKey: @800, }, }; compressionEncoder.audioSettings = @ { AVFormatIDKey: @(kAudioFormatMPEG4AAC), AVNumberOfChannelsKey: @2, AVSampleRateKey: @44100, AVEncoderBitRateKey: @128000, };
'''
预计每秒帧数较少的视频,每个帧的质量相同。类似于视频的简短缩略图摘要
解决方案
您正在执行的转换类型将在移动设备上耗费时间和精力,但我猜您已经意识到这一点。
鉴于您的最终目标是减小尺寸,同时大概保持合理的质量,您可能会发现您想在编码中尝试不同的设置等。
对于这种类型的视频操作,ffmpeg 是一个不错的选择,正如您可能从命令行使用中看到的那样。要在应用程序中使用 ffmpeg,一种常见的方法是使用受良好支持的“ffmpeg 包装器”——这可以有效地在您的应用程序中运行 Ffmpeg 命令行命令。
优点是所有常用语法都可以使用,并且您可以利用网络上有关 ffmpeg 命令行语法的大量信息。缺点是 ffmpeg 并非设计成这样包装,因此您可能会看到一些问题,尽管使用支持良好的包装器,您应该找到帮助或其他人已经解决了这些问题。
一些流行的 iOS ffmpeg 包装器示例:
推荐阅读
- php - PHP在十进制的4个非零数字后切掉数字
- nlp - 如何在 Google Colab 中导入保存的模块?
- java - 数组返回 null
- python-3.x - 在 python 3 中访问 if 语句时遇到问题
- ios - 使用 ImageSlideshow pod 时显示上一个 tableview 单元格中的重复图像
- javascript - 如何以金字塔形状打印 1 到 10
- reactjs - 有什么办法可以防止计数器重新启动
- java - 如何在 Spring Boot 应用程序(Hibernate + JPA)中从 Postgresql 中提取图像(lob)?
- rust - 如何在 rust 的 src 之外的测试目录中使用 lib?
- asp.net-mvc - 如何获取 ASP.NET MVC 中的特定行?