You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xamarin Community Toolkit的Camera View录制时修改视频分辨率?

在Xamarin中保留编解码器并降低视频分辨率的解决方案

由于Xamarin Community Toolkit未提供直接修改视频分辨率且保留原编解码器的能力,你需要针对Android和iOS平台分别调用原生媒体处理API来实现需求,以下是具体方案:

Android平台实现

使用Android原生的MediaExtractor和MediaCodec组件,直接操作音视频流,复用原编解码器参数仅修改分辨率:

using Android.Media;
using Android.OS;
using System.IO;

public async Task ResizeVideoAndroid(string inputPath, string outputPath, int targetWidth, int targetHeight)
{
    await Task.Run(() =>
    {
        var extractor = new MediaExtractor();
        extractor.SetDataSource(inputPath);

        // 获取视频轨和音轨索引及格式
        int videoTrackIndex = -1;
        int audioTrackIndex = -1;
        MediaFormat videoFormat = null;
        MediaFormat audioFormat = null;

        for (int i = 0; i < extractor.TrackCount; i++)
        {
            var format = extractor.GetTrackFormat(i);
            string mime = format.GetString(MediaFormat.KeyMime);
            if (mime.StartsWith("video/"))
            {
                videoTrackIndex = i;
                videoFormat = format;
                // 修改目标分辨率,保留原编解码器的比特率、帧率等参数
                videoFormat.SetInteger(MediaFormat.KeyWidth, targetWidth);
                videoFormat.SetInteger(MediaFormat.KeyHeight, targetHeight);
            }
            else if (mime.StartsWith("audio/"))
            {
                audioTrackIndex = i;
                audioFormat = format;
            }
        }

        if (videoTrackIndex == -1) return;

        // 初始化视频编码器
        var videoCodec = MediaCodec.CreateEncoderByType(videoFormat.GetString(MediaFormat.KeyMime));
        videoCodec.Configure(videoFormat, null, null, MediaCodecConfigFlags.Encode);
        videoCodec.Start();

        // 初始化音频编码器(如果存在音轨)
        var audioCodec = audioTrackIndex != -1 ? MediaCodec.CreateEncoderByType(audioFormat.GetString(MediaFormat.KeyMime)) : null;
        audioCodec?.Configure(audioFormat, null, null, MediaCodecConfigFlags.Encode);
        audioCodec?.Start();

        // 创建媒体复用器写入输出文件
        using var muxer = new MediaMuxer(outputPath, MediaMuxer.OutputFormat.Mpeg4);
        int outputVideoTrack = muxer.AddTrack(videoFormat);
        int outputAudioTrack = audioTrackIndex != -1 ? muxer.AddTrack(audioFormat) : -1;
        muxer.Start();

        // 循环处理音视频帧(需完善缓冲区读写逻辑,确保数据正确传递)
        // 此处省略具体的帧读取、编码、写入细节,需根据实际场景补充

        // 释放资源
        videoCodec.Stop();
        videoCodec.Release();
        audioCodec?.Stop();
        audioCodec?.Release();
        extractor.Release();
        muxer.Stop();
        muxer.Release();
    });
}

iOS平台实现

利用AVFoundation框架的AVAssetExportSession,通过自定义合成来保留原编解码器并调整分辨率:

using AVFoundation;
using Foundation;
using System.Threading.Tasks;

public async Task ResizeVideoiOS(string inputPath, string outputPath, int targetWidth, int targetHeight)
{
    var asset = AVAsset.FromUrl(NSUrl.FromFilename(inputPath));
    
    // 创建自定义合成对象
    var composition = AVMutableComposition.Create();
    var videoTrack = composition.AddMutableTrack(AVMediaType.Video, 0);
    var sourceVideoTrack = asset.TracksWithMediaType(AVMediaType.Video)[0];
    
    // 插入原视频时间范围到合成轨道
    await videoTrack.InsertTimeRange(CMTimeRange.FromTime(CMTime.Zero, asset.Duration), sourceVideoTrack, CMTime.Zero);
    
    // 应用分辨率缩放变换
    var transform = sourceVideoTrack.PreferredTransform;
    var scaleFactor = (double)targetWidth / sourceVideoTrack.NaturalSize.Width;
    var scaledTransform = transform.Scale(scaleFactor, scaleFactor);
    videoTrack.PreferredTransform = scaledTransform;
    
    // 初始化导出会话,保留原编解码器类型
    var exportSession = new AVAssetExportSession(composition, AVAssetExportSession.PresetPassthrough);
    exportSession.OutputUrl = NSUrl.FromFilename(outputPath);
    exportSession.OutputFileType = asset.GetCompatibleExportFileTypes()[0];
    
    // 执行导出任务
    await exportSession.ExportTaskAsync();
}

注意事项

  • 视频处理属于耗时操作,必须放在后台线程执行,避免阻塞UI
  • 需提前申请文件读写权限,确保应用能访问输入视频并写入输出文件
  • 可根据需求调整目标分辨率(如720p、480p),平衡文件体积与画质

内容的提问来源于stack exchange,提问作者0x43ow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:43:16