如何使用NReco ffmpeg ConvertMedia与filter_complex

时间:2015-12-11 23:31:30

标签: c# ffmpeg

我目前正在将mov视频转换为mp4视频并应用filter_complex,并且它正在运行:

    var ffMpeg = new NReco.VideoConverter.FFMpegConverter();
    ffMpeg.Invoke("-y -i \"" + input/ + "\" -filter_complex \"[0] yadif=0:-1:0,scale=iw*sar:ih,scale='if(gt(a,16/9),1280,-2)':'if(gt(a,16/9),-2,720)'[scaled];[scaled] pad=1280:720:(ow-iw)/2:(oh-ih)/2:black \" -c:v libx264 -c:a mp3 -ab 128k " + output + ".mp4");

但是,我想做同样的事情,但是使用FFMpegConverter类的ConvertMedia方法,以便使用可用的ConvertProgressEventArgs,如所述here

我的第一个赌注是使用ConvertSettings参数在CustomOutputArgs中添加filter_complex。我尝试了以下操作,但它没有正确转换视频(无法播放)。

    ffMpeg.ConvertMedia(this.Video /*+ ".mov"*/, NReco.VideoConverter.Format.mov , outPutVideo1 + ".mp4", NReco.VideoConverter.Format.mp4, new NReco.VideoConverter.ConvertSettings()
                        {
                            CustomOutputArgs = " -filter_complex \"[0] yadif=0:-1:0,scale=iw*sar:ih,scale='if(gt(a,16/9),1280,-2)':'if(gt(a,16/9),-2,720)'[scaled];[scaled] pad=1280:720:(ow-iw)/2:(oh-ih)/2:black \" -c:v libx264 -c:a mp3 -ab 128k " + outPutVideo1 + ".mp4"
                        });

您对如何实现这一点有什么想法吗?或者你知道在使用Invoke方法时是否可以使用ConvertProgress?

谢谢!

1 个答案:

答案 0 :(得分:3)

以下调用与您的ffmpeg.Invoke 相同

ffMpeg.ConvertMedia(this.Video /*+ ".mov"*/, 
    null, // autodetect by input file extension 
    outPutVideo1 + ".mp4", 
    null, // autodetect by output file extension 
    new NReco.VideoConverter.ConvertSettings() {
        CustomOutputArgs = " -filter_complex \"[0] yadif=0:-1:0,scale=iw*sar:ih,scale='if(gt(a,16/9),1280,-2)':'if(gt(a,16/9),-2,720)'[scaled];[scaled] pad=1280:720:(ow-iw)/2:(oh-ih)/2:black \" -c:v libx264 -c:a mp3 -ab 128k "
    }
);

如果输入视频的像素格式与yuv420p不同,则某些编解码器(例如,Windows Media Player)可能无法播放生成的mp4文件。这可以通过额外的ffmpeg输出选项轻松处理:

-pix_fmt yuv420p