C# 在不重新编码的情况下剪切mp4 h264视频文件

C# 在不重新编码的情况下剪切mp4 h264视频文件,c#,video,h.264,mp4,C#,Video,H.264,Mp4,我正在寻找一种方法来分割或剪切用h264编码的mp4视频文件,而不需要重新编码。到目前为止,我使用MicrosoftExpressionEncoder4Pro编辑MP4H264编码文件。问题是,我总是要重新编码文件,这需要时间,如果我只想剪切或分割视频文件,这是不必要的时间。感谢任何帮助或指向正确方向的人。为您提供了基本元素,您可以自己构建一些东西来完成这项工作。我不知道有一个现成的免费解决方案可以做到这一点,但只要您在I帧边界上进行切割,它就相对容易实现。我不知道如何在不重新编码(转码)的情况

我正在寻找一种方法来分割或剪切用h264编码的mp4视频文件,而不需要重新编码。到目前为止,我使用MicrosoftExpressionEncoder4Pro编辑MP4H264编码文件。问题是,我总是要重新编码文件,这需要时间,如果我只想剪切或分割视频文件,这是不必要的时间。感谢任何帮助或指向正确方向的人。

为您提供了基本元素,您可以自己构建一些东西来完成这项工作。我不知道有一个现成的免费解决方案可以做到这一点,但只要您在I帧边界上进行切割,它就相对容易实现。

我不知道如何在不重新编码(转码)的情况下分割视频,但在Windows 8上,转码视频已经内置:

要修剪文件,请调用aysnc方法PrepareFileTranscodeAsync,然后调用PrepareTranscodeResult对象上的TranscodeAync方法

例如:

async void TrimFile(StorageFile srcFile, StorageFile destFile)
{
    MediaEncodingProfile profile =
        MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

    MediaTranscoder transcoder = new MediaTranscoder();

    // Set the start of the trim.
    transcoder.TrimStartTime = new TimeSpan(0, 0, 1);

    // Set the end of the trim.
    transcoder.TrimStopTime = new TimeSpan(0, 0, 9);

    PrepareTranscodeResult prepareOp = await
        transcoder.PrepareFileTranscodeAsync(srcFile, destFile, profile);

    if (prepareOp.CanTranscode)
    {
        var transcodeOp = prepareOp.TranscodeAsync();
        transcodeOp.Progress +=
            new AsyncActionProgressHandler<double>(TranscodeProgress);
        transcodeOp.Completed +=
            new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
    }
    else
    {
        switch (prepareOp.FailureReason)
        {
            case TranscodeFailureReason.CodecNotFound:
                OutputText("Codec not found.");
                break;
            case TranscodeFailureReason.InvalidProfile:
                OutputText("Invalid profile.");
                break;
            default:
                OutputText("Unknown failure.");
                break;
        }
    }
}
async void TrimFile(StorageFile srcFile,StorageFile destFile)
{
媒体编码配置文件=
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);
MediaTranscoder transcoder=新的MediaTranscoder();
//设置修剪的起点。
transcoder.TrimStartTime=新的时间跨度(0,0,1);
//设置修剪的末端。
transcoder.TrimStopTime=新的时间跨度(0,0,9);
PrepareTranscodeResult prepareOp=等待
transcoder.preparefiletranscodesync(srcFile、destFile、profile);
如果(准备CanTranscode)
{
var transcodeOp=prepareOp.TranscodeAsync();
转码进展+=
新的AsyncActionProgressHandler(代码转换进程);
转码。完成+=
新的AsyncActionWithProgressCompletedHandler(代码转换完成);
}
其他的
{
开关(准备故障原因)
{
案例代码转换失败原因.codeConnotfound:
OutputText(“未找到编解码器”);
打破
案例代码转换失败原因.InvalidProfile:
OutputText(“无效配置文件”);
打破
违约:
输出文本(“未知故障”);
打破
}
}
}

也可以为较旧的窗口设置(使用)


希望它能帮助某些人。

取决于视频的编码方式。除非在关键帧边界上拆分,否则通常至少需要对其部分进行重新编码。在关键帧边界上拆分对我来说很好,但我在c#@Kevkong中找不到可用于此“简单”任务的库。我相信它不存在。如果对来自c#的媒体进行任何低级操作,您很可能需要p/invoke来做很多事情。如果您想对MP4文件进行残酷的任意剪切,并因此修改头文件,我真的希望他不需要超级优化的低级c代码。我要做的是检查格式规范,然后做一些测试,看看解码器是如何消化坏的序列的。在像WP和WinRT这样的新平台上,越少越好。嘿,谢谢你的提示。项目被转移了,但一旦我不得不再次处理这个问题,我会看看你的解决方案/例子。