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

3

我正在寻找一种在不重新编码的情况下,分割或剪切使用h264编码的mp4视频文件的方法。到目前为止,我使用Microsoft Expression Encoder 4 Pro来编辑mp4 h264编码的文件。问题是,我总是需要重新编码文件,这需要时间,如果我只想裁剪或拆分视频文件,则会浪费不必要的时间。如果您能提供帮助或指向正确的方向,将不胜感激。


取决于视频的编码方式。除非您在关键帧边界处进行拆分,否则通常需要重新编码至少一部分内容。 - Marc B
在关键帧边界上进行分割对我来说很好,但我没有找到任何可用于此“简单”任务的库在C#中使用。 - Kevkong
2个回答

4

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

要修剪文件,请调用异步方法PrepareFileTranscodeAsync,然后在PrepareTranscodeResult对象上调用TranscodeAsync方法。

例如:

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;
        }
    }
}

如何裁剪视频文件(使用C#/VB/C++和XAML的Windows Store应用程序)

对于旧版Windows,也可以使用Splicer(使用DirectShow.Net)。

希望能帮助到有需要的人。


嘿,谢谢你的提示。这个项目已经改变了,但是下次我再遇到这个问题时,我会看一下你的解决方案/示例。 - Kevkong

0

libmp4v2提供了构建自己实现此功能所需的基本工具。虽然我不知道是否有免费的现成解决方案可以做到这一点,但只要您在I帧边界上进行切割,实现起来应该相对容易。


@Kevkong 我不相信它存在。如果您想从C#进行任何低级媒体操作,最有可能的是需要使用p/invoke调用其他程序。 - Yaur
如果有人想要在MP4文件上进行残酷的任意剪切,并且只是修改头文件,我真的希望他不需要超级优化的低级C代码。我会检查格式规范,然后进行一些测试,以查看解码器如何处理损坏的序列。在像WP和WinRT这样的新平台上,越少越好。 - Léon Pelletier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接