【发布时间】:2022-01-14 08:02:20
【问题描述】:
我正在尝试通过合并 1 个“.mov”文件和 2 个或更多“.caf”文件来创建视频,我的代码在合并 1 个“.mov”文件和 1 个“.caf”文件时工作正常,并且它将其与更多“.caf”文件合并时不会崩溃也不会抛出任何错误,但是,在后一种情况下,唯一可以听到的音频是第一个音频。 我试过在不同的时间添加音频,同时添加2个,但结果是一样的,只有1个音频。
如果我尝试合并视频的音频,同样的事情会发生,只能听到第一个音频(视频的音频)。
这是我的代码:
public void mergeAudios()
{
//This funtion merges the final video with the new audio
//microphone
AVCaptureDevice microphone = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Audio);
AVMutableComposition mixComposition = new AVMutableComposition();
#region HoldVideoTrack
AVAsset video_asset = AVAsset.FromUrl(NSUrl.FromFilename(FinalVideo));
CMTimeRange range;
range = new CMTimeRange()
{
Start = new CMTime(0, 0),
Duration = video_asset.Duration
};
AVMutableCompositionTrack videoTrack = mixComposition.AddMutableTrack(AVMediaType.Video, 0);
AVAssetTrack assetVideoTrack = video_asset.TracksWithMediaType(AVMediaType.Video)[0];
videoTrack.InsertTimeRange(range, assetVideoTrack, mixComposition.Duration, out NSError error1);
try
{
CMTime prevDur = CMTime.Zero;
foreach (Audio _audio in TTS_list)
{
AVAsset audio_asset = AVAsset.FromUrl(NSUrl.FromFilename(_audio.Path));
CMTime aaa = new CMTime((long)(_audio.Starting_Point * Convert.ToDouble(mixComposition.Duration.TimeScale)), mixComposition.Duration.TimeScale);
AVMutableCompositionTrack audioTrack = mixComposition.AddMutableTrack(AVMediaType.Audio, 0);
AVAssetTrack assetAudioTrack = audio_asset.TracksWithMediaType(AVMediaType.Audio)[0];
audioTrack.InsertTimeRange(_audio.Range, assetAudioTrack, prevDur /*aaa*/, out NSError error3);
prevDur += _audio.Range.Duration;
}
}
catch (Exception error) { }
#endregion
#region Instructions
AVMutableVideoCompositionLayerInstruction[] Instruction_Array = new AVMutableVideoCompositionLayerInstruction[1];
Instruction_Array[0] = SetInstruction(video_asset, mixComposition.Duration, videoTrack);
#endregion
// 6
var mainInstruction = new AVMutableVideoCompositionInstruction();
CMTimeRange rangeIns = new CMTimeRange()
{
Start = new CMTime(0, 0),
Duration = mixComposition.Duration
};
mainInstruction.BackgroundColor = UIColor.FromRGBA(0.63f, 0.84f, 0.82f, 1.000f).CGColor;
mainInstruction.TimeRange = rangeIns;
mainInstruction.LayerInstructions = Instruction_Array;
var mainComposition = new AVMutableVideoComposition()
{
Instructions = new AVVideoCompositionInstruction[1] { mainInstruction },
FrameDuration = new CMTime(1, 30),
RenderSize = new CoreGraphics.CGSize(UIScreenWidth, UIScreenHeight)
};
//... export video ...
pathh = NSUrl.FromFilename(Path.Combine(Path.GetTempPath(), "temporaryClip/Whole2.mov"));
AVAssetExportSession exportSession = new AVAssetExportSession(mixComposition, AVAssetExportSessionPreset.MediumQuality)
{
OutputUrl = NSUrl.FromFilename(Path.Combine(Path.GetTempPath(), "temporaryClip/Whole2.mov")),
OutputFileType = AVFileType.QuickTimeMovie,
ShouldOptimizeForNetworkUse = true,
VideoComposition = mainComposition
};
exportSession.ExportAsynchronously(_OnExportDone);
}
如果您需要更多信息,我会在看到您的请求后立即提供。谢谢大家的时间,祝你有美好的一天。
【问题讨论】:
标签: c# ios swift iphone avfoundation