我有一个视频文件和一个音频文件。是否有可能通过声音文件将它合并到一个视频中。我认为AVMutableComposition应该可以帮助我,但我仍然不知道如何。任何建议?如何将音频添加到iPhone上的视频文件SDK
回答
感谢丹尼尔。我觉得它很简单。
AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];
AVMutableComposition* mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
atTime:kCMTimeZero error:nil];
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
atTime:kCMTimeZero error:nil];
AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition
presetName:AVAssetExportPresetPassthrough];
NSString* videoName = @"export.mov";
NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
NSURL *exportUrl = [NSURL fileURLWithPath:exportPath];
if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath])
{
[[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}
_assetExport.outputFileType = @"com.apple.quicktime-movie";
DLog(@"file type %@",_assetExport.outputFileType);
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;
[_assetExport exportAsynchronouslyWithCompletionHandler:
^(void) {
// your completion code here
}
}
];
是的,这是可能的,这里是一段代码,用于添加音频到现有的作品,我从苹果示例代码抓住了这个,你应该可以查看整个项目,你会发现它非常有用,项目是AVEditDemo,你可以在他们在这里发布的WWDC 2010资料中找到它。developer.apple.com/videos/wwdc/2010。希望帮助
- (void)addCommentaryTrackToComposition:(AVMutableComposition *)composition withAudioMix:(AVMutableAudioMix *)audioMix
{
NSInteger i;
NSArray *tracksToDuck = [composition tracksWithMediaType:AVMediaTypeAudio]; // before we add the commentary
// Clip commentary duration to composition duration.
CMTimeRange commentaryTimeRange = CMTimeRangeMake(self.commentaryStartTime, self.commentary.duration);
if (CMTIME_COMPARE_INLINE(CMTimeRangeGetEnd(commentaryTimeRange), >, [composition duration]))
commentaryTimeRange.duration = CMTimeSubtract([composition duration], commentaryTimeRange.start);
// Add the commentary track.
AVMutableCompositionTrack *compositionCommentaryTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, commentaryTimeRange.duration) ofTrack:[[self.commentary tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:commentaryTimeRange.start error:nil];
NSMutableArray *trackMixArray = [NSMutableArray array];
CMTime rampDuration = CMTimeMake(1, 2); // half-second ramps
for (i = 0; i < [tracksToDuck count]; i++) {
AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:[tracksToDuck objectAtIndex:i]];
[trackMix setVolumeRampFromStartVolume:1.0 toEndVolume:0.2 timeRange:CMTimeRangeMake(CMTimeSubtract(commentaryTimeRange.start, rampDuration), rampDuration)];
[trackMix setVolumeRampFromStartVolume:0.2 toEndVolume:1.0 timeRange:CMTimeRangeMake(CMTimeRangeGetEnd(commentaryTimeRange), rampDuration)];
[trackMixArray addObject:trackMix];
}
audioMix.inputParameters = trackMixArray;
}
这哪里是演示?我找不到任何地方的下载。 – 2011-08-18 20:48:53
是......演示在哪里? – 2012-11-03 14:57:45
我只合并一个音频/视频文件。问题是,我的视频文件为40秒,音频文件为28秒。因此,对于剩余的12(40-28)秒 - 我想在音频文件中从0秒开始重复播放。我怎么样?有没有直接的方法来做到这一点? – Hemang 2015-06-18 11:26:04
这里是SWIFT版本:
func mixAudio(audioURL audioURL: NSURL, videoURL: NSURL) {
let audioAsset = AVURLAsset(URL: audioURL)
let videoAsset = AVURLAsset(URL: videoURL)
let mixComposition = AVMutableComposition()
let compositionCommentaryTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
// add audio
let timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
let track = audioAsset.tracksWithMediaType(AVMediaTypeAudio)[0]
do {
try compositionCommentaryTrack.insertTimeRange(timeRange, ofTrack: track, atTime: kCMTimeZero)
}
catch {
print("Error insertTimeRange for audio track \(error)")
}
// add video
let compositionVideoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
let timeRangeVideo = CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
let trackVideo = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
do {
try compositionVideoTrack.insertTimeRange(timeRangeVideo, ofTrack: trackVideo, atTime: kCMTimeZero)
}
catch {
print("Error insertTimeRange for video track \(error)")
}
// export
let assetExportSession = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetPassthrough)
let videoName = "export.mov"
exportPath = "\(NSTemporaryDirectory())/\(videoName)"
let exportURL = NSURL(fileURLWithPath: exportPath!)
if NSFileManager.defaultManager().fileExistsAtPath(exportPath!) {
do {
try NSFileManager.defaultManager().removeItemAtPath(exportPath!)
}
catch {
print("Error deleting export.mov: \(error)")
}
}
assetExportSession?.outputFileType = "com.apple.quicktime-movie"
assetExportSession?.outputURL = exportURL
assetExportSession?.shouldOptimizeForNetworkUse = true
assetExportSession?.exportAsynchronouslyWithCompletionHandler({
print("Mixed audio and video!")
dispatch_async(dispatch_get_main_queue(), {
print(self.exportPath!)
})
})
}
- 1. 如何将视频添加到iPhone SDK上的音频文件
- 2. 如何将音频添加到视频?
- 3. iPhone SDK - presentMoviePlayerViewControllerAnimated没有视频,但音频
- 4. 在iPhone中为视频或音频文件添加书签
- 5. Windows视频 - 添加音频流到AVI
- 6. 如何合并iPhone中的实时流视频和音频sdk
- 7. 音频文件不与iPhone的SDK
- 8. FFMPEG添加音频到视频,但它夹到视频长度
- 9. 将音频文件添加到另一个音频文件,最终结果为一个新的音频文件
- 10. iOS Sdk将音频添加到iPad上的按钮?
- 11. iPhone SDK修剪音频文件
- 12. 用iPhone SDK切割音频文件
- 13. 如何在iPhone SDK中上传视频
- 14. 将音频添加到由OpenCV生成的视频
- 15. 音频和视频文件
- 16. 在iPhone中添加视频文件
- 17. 将音频直接复制到iPhone上的音频缓冲区
- 18. 使用自己的音频作为音频源将音频轨道添加到视频中?
- 19. 如何在iphone sdk中设置音频文件或录制的音频文件的音高?
- 20. 如何仅从Android上的视频文件播放音频?
- 21. iPhone SDK音频混合器
- 22. iPhone SDK - HTML直播音频
- 23. 如何将视频添加到html中
- 24. 如何将视频添加到灯箱?
- 25. 如何合并iphone中的音频文件sdk
- 26. iPhone上的音频
- 27. 录制音频,添加效果,然后将结果保存到音频文件
- 28. 加密Iphone中的音频文件
- 29. 如何加入一个音频和视频文件 - Xuggler
- 30. 合并iPhone上的音频文件
acutually这个peice的代码不工作properly..when我实现这个代码到我的项目就会有上坠毁[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,audioAsset.duration) ofTrack:[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex: 0] atTime:kCMTimeZero error:nil]; 并显示索引为0时没有对象。 – Swastik 2012-03-21 06:09:16
@Swastik我遇到了同样的问题,特别是在处理来自iCloud的文件时。对我来说修复一直是做2件事。 1)验证我试图使用的文件对我试图使用它的媒体类型有效2)确保文件实际上有数据(它有时不与iCloud) – nick 2012-07-02 17:30:02
hi史蒂夫,我只合并一个音频/视频文件。问题是,我的视频文件为40秒,音频文件为28秒。因此,对于剩余的12(40-28)秒 - 我想在音频文件中从0秒开始重复播放。我怎么样?有没有直接的方法来做到这一点? – Hemang 2015-06-18 11:23:55