我的应用程序中有以下代码:
NSURL *url = [NSURL fileURLWithPath: [self.DocDir stringByAppendingPathComponent: self.FileName] isDirectory: NO];
self.avPlayer = [AVPlayer playerWithURL: url];
Float64 duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration);
Run Code Online (Sandbox Code Playgroud)
这适用于iOS 6,但由于某种原因,iOS 7会返回NaN.检查self.avPlayer.currentItem.duration时,CMTime对象的值为0,标志为17.
有趣的是,玩家工作正常,只是持续时间是错误的.
还有其他人遇到过同样的问题吗?我正在导入以下内容:
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
#import <CoreMedia/CoreMedia.h>
#import <AVFoundation/AVAsset.h>
Run Code Online (Sandbox Code Playgroud) 我想知道是否有人可以告诉我如何实现这一目标.如果想到几个解决方案:
从捕获的视频创建单独的图像,然后在每个图像中合并它们,之后创建一个新的AVAsset ...听起来有点复杂你不觉得吗?
合并2个视频,一个是透明的(一个是水印),另一个是用相机拍摄的资产.
下面的新编辑
我已经引用了
AVMutableComposition - 仅播放第一曲目(Swift)
但它没有提供我正在寻找的答案.
我有一个AVMutableComposition().我试图在这个单一的组合中应用MULTIPLE AVCompositionTrack,单一类型AVMediaTypeVideo.这是因为我用2个不同的AVMediaTypeVideo具有不同来源CGSize的和preferredTransforms的的AVAsset"他们来自秒.
因此,应用指定的唯一方法preferredTransforms是在两个不同的轨道中提供它们.但是,无论出于何种原因,只有第一首曲目实际上会提供任何视频,几乎就像第二首曲目从未出现过一样.
所以,我试过了
1)使用AVMutableVideoCompositionLayerInstruction's并且应用一个AVVideoComposition,一个AVAssetExportSession正常工作,我仍然在进行变换,但是可行.但视频的处理时间超过1分钟,这在我的情况下是不适用的.
2)使用多个音轨,AVAssetExportSession不会出现相同类型的第二个音轨.现在,我可以将它全部放在一个轨道上,但所有视频将与第一个视频相同的尺寸和首选视频,这是我绝对不想要的,因为它会在各个方向上拉伸它们.
所以我的问题是,是否有可能
1)在没有使用的情况下将指令应用于轨道AVAssetExportSession?//首选方式BY FAR.
2)减少出口时间?(我已经尝试过使用PresetPassthrough但你不能使用它,如果你有exporter.videoComposition我的指示所在的地方.这是我知道我可以放指令的唯一地方,不知道我是否可以将它们放在其他地方.
这是我的一些代码(没有导出器,因为我不需要在任何地方导出任何东西,只需在AVMutableComposition组合项目后执行操作.
func merge() {
if let firstAsset = controller.firstAsset, secondAsset = self.asset {
let mixComposition = AVMutableComposition()
let firstTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do {
//Don't need now according to not being able to edit …Run Code Online (Sandbox Code Playgroud) 我在追踪资产导出会话失败背后的根本问题时遇到了问题.问题仅针对一个视频,我认为问题出在其音频轨道上,因为我成功导出了没有音轨的资产(只有视频轨道).
使用AVAssetReader对视频轨道进行解码,并在重写为新视频轨道之前处理采样缓冲区; 音频轨道没有解码也没有任何中间处理.但是,即使不处理视频样本缓冲区,也会发生相同的故障.
我也试过反过来做 - 只有音频而没有视频轨道 - 还有其他视频工作正常,这个特定的视频失败了.我认为视频的音轨有一个固有的问题,但我无法推断出问题是什么,因此我无法解决它.这是我的代码:
AVAssetExportSession* assetExport = [[AVAssetExportSession alloc] initWithAsset:composition
presetName:AVAssetExportPresetHighestQuality];
assetExport.outputFileType = @"com.apple.quicktime-movie";
assetExport.outputURL = [NSURL fileURLWithPath:path];
__weak typeof(self) weakSelf = self;
[assetExport exportAsynchronouslyWithCompletionHandler:^{
switch (assetExport.status) {
case AVAssetExportSessionStatusCompleted: NSLog(@"Asset combined");
break;
case AVAssetExportSessionStatusFailed: NSLog(@"Asset combination failed");
break;
default: NSLog(@"Asset combination completed with unknown status: %@", @(assetExport.status));
break;
}
}];
Run Code Online (Sandbox Code Playgroud)
这个问题应该出现在资产出口会议上; 跟踪AVMutableComposition的插入工作得很好.这是AVAssetExportSession的错误消息:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"
UserInfo={NSUnderlyingError=0x6040001338d0 {Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"},
NSLocalizedFailureReason=An unknown error occurred (-12780), NSLocalizedDescription=The operation could not …Run Code Online (Sandbox Code Playgroud) 是否有任何快速,轻量级的方式应用于CIFilter视频?在提到它之前,我已经看过GPUImage - 它看起来像是非常强大的魔法代码,但它对我正在尝试做的事情来说真的太过分了.
基本上,我想
/tmp/myVideoFile.mp4CIFilter视频文件应用于此视频文件/tmp/anotherVideoFile.mp4我已经能够将CIFilter应用到一个非常容易和快速使用的视频中 AVPlayerItemVideoOutput
let player = AVPlayer(playerItem: AVPlayerItem(asset: video))
let output = AVPlayerItemVideoOutput(pixelBufferAttributes: nil)
player.currentItem?.addOutput(self.output)
player.play()
let displayLink = CADisplayLink(target: self, selector: #selector(self.displayLinkDidRefresh(_:)))
displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
func displayLinkDidRefresh(link: CADisplayLink){
let itemTime = output.itemTimeForHostTime(CACurrentMediaTime())
if output.hasNewPixelBufferForItemTime(itemTime){
if let pixelBuffer = output.copyPixelBufferForItemTime(itemTime, itemTimeForDisplay: nil){
let image = CIImage(CVPixelBuffer: pixelBuffer)
// apply filters to image
// display image
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个伟大的工程,但我一直有很多只是麻烦哪怕一丁点找出如何将过滤器应用到已保存的视频文件.有一个选项,基本上只是做我上面做的,使用AVPlayer,播放视频,并在播放时从每一帧获取像素缓冲区,但这不适用于后台视频处理.我不认为用户会喜欢等待他们的视频用于过滤器的应用. …
我正在使用一个应用程序,用户从照片中选择视频并将其上传到服务器.由于我的服务器是.Net服务器,因此视频会轮换.我知道问题的原因可能与图像的情况相同(你可以参考我之前的答案/sf/answers/742082281/),所以我用谷歌搜索并得到一个代码来修复视频方向,我从RayWenderlich.com获得代码并按以下方式修改.现在我的输出视频工作正常,但视频是静音.它播放但不播放音频.如果我遗失了什么,请帮助我.
我传递-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info方法的信息字典
- (void)fix:(NSDictionary*)pobjInfoDirectory withFileName:(NSString*)pstrOutputFileName
{
firstAsset = [AVAsset assetWithURL:[pobjInfoDirectory objectForKey:UIImagePickerControllerMediaURL]];
if(firstAsset !=nil)
{
//Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack.
AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];
//VIDEO TRACK
AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration);
//FIXING ORIENTATION//
AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];
AVAssetTrack *FirstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
UIImageOrientation FirstAssetOrientation_ = …Run Code Online (Sandbox Code Playgroud) 我想获得一个AVAsset视频文件大小,而不是视频的分辨率,但文件重量是KB.
一个解决方案是从持续时间和estimatedDataRate计算估计的文件大小,但这似乎只是为了获得文件大小.
我已经检查了嵌入AVAssetTrack其中的所有数据似乎没有在那里.即使是估计的文件大小也会很好.
这是代码:
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
exporter.outputURL = outputUrl;
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.videoComposition = mainComposition;
exporter.shouldOptimizeForNetworkUse = YES;
[exporter exportAsynchronouslyWithCompletionHandler:^{
//completion
}];
Run Code Online (Sandbox Code Playgroud)
我尝试过不同的质量设置.无论我想渲染什么视频,我总是在视频右侧和底部都有一个1-2像素的边框.可能导致这种情况的原因以及如何解决?
编辑:我没有在任何地方使用任何绿色,所以这必须以某种方式来自框架.
avfoundation ios avmutablecomposition avassetexportsession avasset
我需要使用AVAsset对象,以便使用AVPlayer和AVPlayerLayer播放它.我开始使用Photos框架,因为不推荐使用AssetsLibrary.现在我到了我有一个PHAsset对象数组的点,我需要将它们转换为AVAsset.我尝试通过PHFetchResult枚举并使用PHAsset的本地化描述分配新的AVAsset,但是当我播放时它似乎没有显示任何视频.
PHAssetCollection *assetColl = [self scaryVideosAlbum];
PHFetchResult *getVideos = [PHAsset fetchAssetsInAssetCollection:assetColl options:nil];
[getVideos enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
NSURL *videoUrl = [NSURL URLWithString:asset.localizedDescription];
AVAsset *avasset = [AVAsset assetWithURL:videoUrl];
[tempArr addObject:avasset];
}];
Run Code Online (Sandbox Code Playgroud)
我假设本地化描述不是视频的绝对URL.
我还偶然发现了PHImageManager和requestAVAssetForVideo,但是,当涉及到视频时,options参数没有isSynchrounous属性,image参数就是这种情况.
PHVideoRequestOptions *option = [PHVideoRequestOptions new];
[[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:option resultHandler:^(AVAsset * _Nullable avasset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
Run Code Online (Sandbox Code Playgroud)
有同步方法吗?
谢谢.
我正在制作一个播放器,我想列出所有文件,并且在我想要显示视频持续时间的所有文件前面.
唯一的问题是我没有获得正确的视频持续时间,有时它会导致完全错误的持续时间.
我尝试过以下解决方案:
let asset = AVAsset(url: "video.mp4")
let duration = asset.duration.seconds
Run Code Online (Sandbox Code Playgroud)
因此,时间有时会给出另一个值.如果有人知道可能的解决方案,我很高兴听到.
我已经使用一种可能的解决方案更新了代码但是它运行不正常,
let asset = AVAsset(url: url)
let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)
let minutes = Double(durationTime / 60)
Run Code Online (Sandbox Code Playgroud)
我尝试过持续时间为11:47分钟的视频,然后它返回我= 11:78,视频怎么能有11分78秒呢?
所以我认为问题在于视频,我选择了另一个1:16分钟的视频,并且返回的值再次是1:26(错误10秒)