- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个奇怪的问题。在我的应用程序中,我使用下面的代码组合多个音频和视频文件。一旦我将生成的视频从设备下载到计算机并使用 Quick Time 播放,生成的视频似乎工作正常,但每当我尝试使用 UIWebView 或 AVPLayer 播放新合成的视频时,我只能看到合并视频文件的第一部分。
此外,当我尝试使用 MPMoviePlayerController 播放时,它卡在“加载中”。
我可以听到所有作品的音频。为了清楚起见,我有两个数组:1- 带有音频文件路径的 audioPieces [song1, song2, song3];2- 带有视频文件路径的 moviePieces [movie1,movie2,movie3];合并这些文件后,我只能看到电影 1,但可以听到歌曲 1 + 歌曲 2 + 歌曲 3。附言歌曲和电影的长度不同(相差小于 0.2 秒)。任何帮助将不胜感激。先感谢您,雅努斯
-(void)putFilesTogether{
AVMutableComposition *mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *videoCompositionTrack =[[AVMutableCompositionTrack alloc]init];
AVMutableCompositionTrack *audioCompositionTrack =[[AVMutableCompositionTrack alloc]init];
NSLog(@" movie %@ audio %@ ", moviePieces, audioPieces);
NSError * error;
for(int i=0;i<moviePieces.count;i++)
{
NSFileManager * fm = [NSFileManager defaultManager];
NSString * movieFilePath;
NSString * audioFilePath;
movieFilePath = [moviePieces objectAtIndex:i];
audioFilePath = [audioPieces objectAtIndex:i];
if(![fm fileExistsAtPath:movieFilePath]){
NSLog(@"Movie doesn't exist %@ ",movieFilePath);
}
else{
NSLog(@"Movie exist %@ ",movieFilePath);
}
if(![fm fileExistsAtPath:audioFilePath]){
NSLog(@"Audio doesn't exist %@ ",audioFilePath);
}
else{
NSLog(@"Audio exists %@ ",audioFilePath);
}
NSURL *videoUrl = [NSURL fileURLWithPath:movieFilePath];
NSURL *audioUrl = [NSURL fileURLWithPath:audioFilePath];
AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];
AVAssetTrack *videoAssetTrack= [[videoasset tracksWithMediaType:AVMediaTypeVideo] lastObject];
AVURLAsset *audioasset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVAssetTrack *audioAssetTrack= [[audioasset tracksWithMediaType:AVMediaTypeAudio] lastObject];
videoCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
CMTime tempTime = mixComposition.duration;
[audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioasset.duration) ofTrack:audioAssetTrack atTime:tempTime error:&error];
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoasset.duration) ofTrack:videoAssetTrack atTime:tempTime error:&error];
if(error)
{
NSLog(@"Ups. Something went wrong! %@", [error debugDescription]);
}
}
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *caldate = [now description];
float ran = arc4random()%1000;
NSString * pathToSave = [NSString stringWithFormat:@"Output%@%f.mp4",caldate,ran];
pathToSave =[DOCUMENTS_FOLDER stringByAppendingPathComponent:pathToSave];
NSURL *movieUrl = [NSURL fileURLWithPath:pathToSave];
AVAssetExportSession *exporter =[[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetPassthrough];
exporter.outputFileType=AVFileTypeQuickTimeMovie;
exporter.outputURL=movieUrl;
exporter.shouldOptimizeForNetworkUse=YES;
CMTimeValue val = mixComposition.duration.value;
CMTime start=CMTimeMake(0, 600);
CMTime duration=CMTimeMake(val, 600);
CMTimeRange range=CMTimeRangeMake(start, duration);
exporter.timeRange=range;
[exporter exportAsynchronouslyWithCompletionHandler:^{
switch ([exporter status]) {
case AVAssetExportSessionStatusFailed:{
NSLog(@"Export failed: %@ %@", [[exporter error] localizedDescription],[[exporter error]debugDescription]);
NSString * message = @"Movie wasn't created. Try again later.";
[self performSelectorOnMainThread:@selector(dismissMe:) withObject:message waitUntilDone:NO];
break;}
case AVAssetExportSessionStatusCancelled:{ NSLog(@"Export canceled");
NSString * message1 = @"Movie wasn't created. Try again later.";
[self performSelectorOnMainThread:@selector(dismissMe:) withObject:message1 waitUntilDone:NO];
break;}
case AVAssetExportSessionStatusCompleted:
{
NSString * message = @"Movie was successfully created.";
CMTime duration = mixComposition.duration;
[self saveData:duration ofPath:pathToSave];
[self cleanFiles];
[self performSelectorOnMainThread:@selector(dismissMe:) withObject:message waitUntilDone:NO];
}
}}];
最佳答案
问题在于:
videoCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
它们需要移到 for 循环体之外。
关于ios - 使用 AVMutableComposition 组合视频和音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14247985/
我正在尝试在嵌套层次结构中使用 AVMutableComposition。因此我必须将一个作品放入另一个作品中。这样做会导致以下错误消息: AVCompositionTest[45347:10703]
当源视频为纵向时,此功能会将合并的合成导出为横向。我将原始视频以纵向保存到我的文档目录中,然后将其保存到相机胶卷中并且工作正常。然后,我将保存的视频的 URL 传递给该函数,它会以某种方式将其旋转为横
我在 iOS 应用程序中使用 AVCaptureConnection 捕获视频。之后,我在视频中添加一些图像作为 CALayers。一切工作正常,但在添加图像后,我在生成的视频的最后出现黑框。实际音频
我一直在尝试使用 AVMutableComposition 将音频(录制的)与视频(.mp4)混合,这意味着我需要 2 个文件在混合后并行播放,这是我使用的代码:temporaryRecFile 为录
我正在使用 PryntTrimmerView 来修剪视频文件。有我的导出修剪视频文件和生成视频缩略图的代码: func prepareAssetComposition() throws { g
我有点困惑为什么每次出现这一行都被视为内存泄漏: let asset = AVMutableComposition() 查看 SO 并没有真正找到任何答案。只是想在我提交到应用商店之前清除一些内存泄漏
我的应用程序结合了视频序列,并根据情况将音乐添加到最终序列。添加音乐后,该应用会检查用户是否选择了一段视频作为开场,然后将其组合成最终视频。 在运行 profiler 时,我在第二次和第三次执行此操作
我一天中的大部分时间都在围绕 StackOverflow 进行深入研究,虽然有很多关于该主题的精彩帖子,但我还没有找到解决我的问题的方法。 p> 我正在使用 AVAssetWriter 编写视频文件,
我想在我的 AVMutableComposition 的末尾渲染一些图形,就像电影结尾的演职员表一样。我怎样才能创建一个空白 Assets 来延长合成时间,给我一些可以渲染的空白空间? 最佳答案 我找
我有一个与 AVPlayer 关联的 AVMutableComposition。似乎如果我将轨道添加到这个组合中,AVPlayer 不会播放添加的轨道,除非我再次在播放器上设置组合。现在我只是通过用已
这个问题与AVMutableComposition - Blank/Black frame between videos assets 很相关但由于我没有使用 AVAssetExportSession
我正在使用 AVMutableComposition 和 AVAssetExportSession 来剪辑视频。随机地,我的意思是随机地(我无法始终如一地重现)用户的视频在修剪视频的开头有几个黑框。音
我正在使用 AVMutableComposition 创建视频并使用 AVAssetExportSession 导出它并为其提供预设 AVAssetExportPresetHighestQuality
我正在尝试使用 AVMutableComposition 将图像渲染到使用前置摄像头拍摄的视频中。生成的视频(包括图像)的大小非常好。 但是,初始视频将调整大小,如下图所示: 我正在使用 NextLe
为了修剪视频,我使用了AVMutableCompositionTrack的removeTimeRange方法。 [mCachedCompositionTrack removeTimeRange:CMT
我正在尝试将 4 个音轨组合成一个乐曲,然后将该乐曲导出到一个文件。到目前为止,我的文件已成功创建,但所有音轨都以全音量播放,而不是我尝试设置的音量级别。这是我现在正在做的事情: AVMutableC
我正在尝试合并和裁剪一系列视频。一切正常,但生成的视频旋转了 90 度。我试图应用旋转变换,但没有任何 react 。我已经查看了至少 4 个其他线程,看看他们的解决方案是什么,而且他们几乎都在做和我
我在视频上添加水印。我设置了原点水印层(10;10),但是导出后,水印位于左下角。如果我增加 y,水印会向上移动。好像y轴自下而上增加。 任何人都可以提出一些建议吗? NSString *path =
我在此处发布的问题的答案中使用代码(在下面添加): Swift 3: How to add watermark on video ? AVVideoCompositionCoreAnimationTo
我构建的应用程序需要以下功能: 将视频组合成单个 AVMutableComposition 并将该单个视频组合呈现给用户。 以多个 block 的形式导出视频合成。例如,如果整个作品时长为 60 秒,
我是一名优秀的程序员,十分优秀!