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);
}
}
需要帮助解决后续问题。 我从 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);
}
}