FFMPEG NReco.ConcatMedia 合并来自不同来源的文件

FFMPEG NReco.ConcatMedia merging files from different sources

需要帮助解决后续问题。 我从 youtube 下载了 3 个视频,并使用 NReco.VideoConverter.FFMpegConverter.ConvertMedia 将其切成小块,代码如下:

        ffMpegConverter.ConvertMedia (SourceFile, Format.mp4, tempVideo, Format.mp4,
        new ConvertSettings () {
            Seek = StartTime,
            MaxDuration = (EndTime - StartTime),
            VideoCodec = "libx264",
            AudioCodec = "mp3",
            CustomOutputArgs = string.Format ("-vf \"pad=640:360:x=(640-iw)/2:y=(360-ih)/2:color=black\" -af \"volume = {0}dB\"", volumeMultiplier),
            VideoFrameRate = 25,
            AudioSampleRate = 44100,
            VideoFrameSize = "640x360"
        });

并添加了水印(仅使用内联 ffmpeg 命令):

-i {0} -i {1} -filter_complex \"[1:v]scale={3}:{4},format=argb,colorchannelmixer=aa={5}[wat];[0:v][wat]overlay=main_w-overlay_w-{6}:main_h-overlay_h-{7} [out]\" -map \"[out]\" -map 0:a -y {2}

当我连接来源#1 和#2 的视频片段时没问题,但与#3 连接时不行。我相信它在 (#1, #2) 和 (#3) 格式之间存在某种兼容性问题,但应该在 ConvertMedia 阶段修复,不是吗?可能是我错过了一些 OutPut 参数?

来自源 #3 的文件的媒体信息示例 https://jpst.it/Zoof

还有一个用于来源 #2 的文件 https://jpst.it/ZooC

为什么那个文件不能合并,到哪里找原因?

谢谢。

我没有找到 NReco 不合并那些文件的原因,但我写了自己的包装器

     static void Main (string[] args) {
        concatMedia (new string[] {
        args[0], args[1]
        }, args[2]);
     }

    private static string makeTempFile (string fileName) {
        FFMpegConverter c = new FFMpegConverter ();
        FileInfo fileInfo = new System.IO.FileInfo (fileName);
        string tempFile = Path.Combine (fileInfo.DirectoryName, Path.GetFileNameWithoutExtension (fileName) + ".ts");
        c.Invoke (string.Format ("-i {0} -c copy -bsf:v h264_mp4toannexb -f mpegts -y {1}", fileName, tempFile));
        return tempFile;
    }

    private static void concatMedia (string[] files, string output) {
        FFMpegConverter c = new FFMpegConverter ();
        List<string> tempFiles = new List<string> ();
        foreach (var item in files) {
            tempFiles.Add (makeTempFile (item));
        }
        c.Invoke (string.Format ("-i \"concat:{0}\" -c copy -bsf:a aac_adtstoasc -y {1}", string.Join ("|", tempFiles), output));
        foreach (var item in tempFiles) {
            System.IO.File.Delete (item);
        }
    }