C# 在asp.net应用程序中使用ffmpeg查找水印路径时出错

C# 在asp.net应用程序中使用ffmpeg查找水印路径时出错,c#,asp.net,ffmpeg,C#,Asp.net,Ffmpeg,我正在使用在视频上发布水印。若我直接执行ffmpeg命令,则发布水印效果良好,但若通过asp.net应用程序执行该命令,则无法找到合适的水印png文件位置 下面是ffmpeg命令示例 string RootPath = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath); _mhandler.FFMPEGPath = RootPath + "/ffmpeg_aug_2013/bin/ffm

我正在使用在视频上发布水印。若我直接执行ffmpeg命令,则发布水印效果良好,但若通过asp.net应用程序执行该命令,则无法找到合适的水印png文件位置

下面是ffmpeg命令示例

string RootPath = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath);
_mhandler.FFMPEGPath = RootPath + "/ffmpeg_aug_2013/bin/ffmpeg.exe";
_mhandler.InputPath = RootPath + "/contents/original";
_mhandler.OutputPath = RootPath + "/contents/mp4";
_mhandler.BackgroundProcessing = false;
_mhandler.FileName = "wildlife.wmv";
_mhandler.OutputFileName = "wildlife_ddd";
string presetpath = RootPath + "/ffmpeg_aug_2013/presets/libx264-ipod640.ffpreset";
_mhandler.OutputExtension = ".mp4";
_mhandler.Parameters = "-s 640x380 -b:v 500k -bufsize 500k -b:a 128k -ar 44100 -c:v libx264 -vf \"movie = watermark.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]\"";
_mhandler.Parameters = _mhandler.Parameters + " -fpre \"" + presetpath + "\"";
VideoInfo info =  _mhandler.Process();
我也试过直接代码

string _out = "";
Process _process = new Process();
_process.StartInfo.UseShellExecute = false;
_process.StartInfo.RedirectStandardInput = true;
//_process.StartInfo.RedirectStandardOutput = true;
_process.StartInfo.RedirectStandardError = true;
_process.StartInfo.CreateNoWindow = true;
_process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
_process.StartInfo.FileName = _ffmpegpath;
_process.StartInfo.Arguments = cmd;
if (_process.Start())
{             
    _process.WaitForExit(ExitProcess);
    _out = _process.StandardError.ReadToEnd();
    if (!_process.HasExited)
      _process.Kill();

    return _out;
 }
ffmpeg错误输出为

FFMPEG输出:FFMPEG版本N-55753-g88909be版权所有(c)2000-2013 FFmpeg开发人员于2013年8月24日21:40:51使用gcc 4.7.3构建 (GCC)配置:--enable-gpl--enable-version3 --disable-w32threads--enable-avisynth--enable-bzlib--enable-fontconfig--enable-frei0r--enable-gnutls--enable-iconv--enable libass--enable libblebluray--enable libcaca--enable libfreetype--enable libmodplug--enable-libmp3lame--enable libopencore amrnb--enable libopencore amrwb--enable libopen jpeg--启用libopus——启用librtmp——启用libschroedinger——启用libsoxr——启用libspeex——启用libthera——启用libtwolame——启用libvo aacenc——启用libvo amrwbenc——启用libvorbis——启用libvpx——启用libx264——启用libxavs——启用libxvid——启用zlib libavutil 52。42.100 / 52. 42.100 libavcodec 55。29.100 / 55. 29.100 libav55格式。14.102 / 55. 14.102 libav设备55。3.100 / 55. 3.100 libavfilter 3。82.102 / 3. 82.102 libswscale 2。5.100 / 2. 5.100 libswresample 0。17.103 / 0. 17.103 LIBROC 52。3.100 / 52. 3.100[asf@024c9960]流#0:没有足够的帧来估计速率;考虑增加输入流

的猜测通道布局 0.0:stereo Input#0,asf,来自“F:\own\mhp_new/contents/original\widlife.wmv”:元数据: SfOriginalFPS:299700 WMFSDKVersion:11.0.6001.7000 WMFSDK需要: 0.0.0.0000评论:镜头:小世界制作公司;新西兰旅游业|制片人:加里·斯普拉德|音乐:史蒂夫·鲍尔标题: HD中的野生动物版权所有:2008 Microsoft Corporation IsVBR:0 DeviceConformanceTemplate:AP@L3持续时间:00:00:30.09,开始时间: 0.000000,比特率:6977 kb/s流#0:0(英文):音频:wmav2(a[0][0]/0x0161),44100 Hz,立体声,fltp,192 kb/s流

0:1(英文):视频:vc1(高级)(WVC1/0x31435657),yuv420p,1280x720,5942 kb/s,29.97 tbr,1k tbn,1k tbc[image2@024c76e0] 找不到路径为“watermark.png”且索引在范围内的文件 0-4[Parsed_movie_0@024c0540]无法格式化打开的输入 “watermark.png”[AVFilterGraph@024ca100]初始化筛选器时出错 带有args“watermark.png”的“movie”打开筛选器时出错!错误代码=0

点错误(找不到路径为'watermark.png'的文件)显示找不到watermark.png文件。 我将watermark.png文件放在以下位置,但仍然找不到

i:应用程序根

ii:实际aspx页面所在的根目录

三:ffmpeg根

iv:ffmpeg/bin/

我也使用了完整路径,但仍然无法检测到

注意:如果我在php中使用相同的ffmpeg命令,并将watermark.png放在实际php页面存在的位置上,水印被正确检测并正确执行命令,但相同的方法在asp.net中不起作用


谁能帮我把watermark.png文件放在哪里,这样脚本就可以访问它。

对于你的问题,我不知道你到底是如何执行ffmpeg的,因为你没有发布相应的代码,所以我会更笼统地回答

当您通过相对路径(
watermark.png
)引用某个文件时,它当然必须位于中

普通子流程从创建子流程的流程(也称为asp.net应用程序和/或Web服务器)继承当前工作目录,或者除非明确设置,否则实现可能会选择某些默认路径。但是,大多数API允许您为要创建的进程指定初始工作目录,例如

  • 或者让您的代码为子流程设置正确的工作目录
  • 或者按绝对路径引用文件。但是请注意,您可能需要多次转义路径和命令行的其余部分(例如“\”或空格)
例如,这里有一个对我来说很有用的完整示例:

using System;
using System.Diagnostics;
using System.IO;

namespace ffmpeg_test
{
  class Program
  {
    static readonly string exe = @"E:\ffmpeg-zeranoe\bin\ffmpeg.exe";
    static readonly string invid = @"E:\in.avi";
    static readonly string outvid = @"E:\out.avi";

    static void Main(string[] args)
    {
      using (var proc = new Process()) {
        Console.WriteLine("Current Directory: {0}", Directory.GetCurrentDirectory());
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.FileName = exe;
        proc.StartInfo.WorkingDirectory = new FileInfo(invid).Directory.FullName;
        Console.WriteLine("Working Directory: {0}", proc.StartInfo.WorkingDirectory);
        proc.StartInfo.Arguments = string.Format(
          "-y -i \"{0}\" -vf \"movie=watermark.png [watermark]; [in][watermark] overlay=10:10 [out]\" {1}",
          invid, outvid);
        Console.WriteLine("Arguments: {0}", proc.StartInfo.Arguments);
        proc.StartInfo.LoadUserProfile = false;
        proc.Start();
        proc.WaitForExit();
        Console.WriteLine("Result: {0}", proc.ExitCode);
      }
    }
  }
}
以及输出:

E:\MSVC\ffmpeg_test\bin\Debug>dir e:\watermark.png e:\in.avi /B
watermark.png
in.avi

E:\MSVC\ffmpeg_test\bin\Debug>ffmpeg_test.exe
Current Directory: E:\MSVC\ffmpeg_test\bin\Debug
Working Directory: E:\
Arguments: -y -i "E:\in.avi" -vf "movie=watermark.png [watermark]; [in][watermark] overlay=10:10 [out]" E:\out.avi
ffmpeg version N-55796-gb74213d Copyright (c) 2000-2013 the FFmpeg developers
  built on Aug 26 2013 19:43:51 with gcc 4.7.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfi
g --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopenco
re-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
eex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-lib
vpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 42.100 / 52. 42.100
  libavcodec     55. 29.100 / 55. 29.100
  libavformat    55. 14.102 / 55. 14.102
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 82.102 /  3. 82.102
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from 'E:\in.avi':
  Metadata:
    encoder         : Lavf55.13.103
  Duration: 00:00:25.46, start: 0.000000, bitrate: 2944 kb/s
    Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 47.95 fps, 23.98 tbr, 47.
95 tbn, 47.95 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 192 kb/s
Output #0, avi, to 'E:\out.avi':
  Metadata:
    ISFT            : Lavf55.14.102
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 23.98 tbn, 23
.98 tbc
    Stream #0:1: Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg4)
  Stream #0:1 -> #0:1 (mp3 -> libmp3lame)
Press [q] to stop, [?] for help
frame=  609 fps=146 q=31.0 Lsize=    3614kB time=00:00:25.56 bitrate=1158.0kbits/s
video:3169kB audio:396kB subtitle:0 global headers:0kB muxing overhead 1.379961%
Result: 0

哦,还有,阿维当然有水印

我正在使用绝对路径作为输入、输出、预设等路径,但绝对路径也找不到水印图像的正确位置当前工作目录返回“c:\windows\system32\inetsrv”尝试执行水印命令并查看作为输出接收的内容。确定,我将尝试自己做一个SSCCE。@irfanmcsd完整示例已到达。请提供实际代码:@nmaier我发布了完整的代码。不,您只发布了部分代码。实际上运行这些东西的代码根本不存在(
\u mhandler.Process()
以及它的任何依赖项)。@nmaier我也发布了流程代码。但我认为代码中并没有问题,问题在于ffmpeg,我认为它选择了任何默认路径,而不是我设置的路径。我也在php中尝试过,它从存在.php文件的实际文件夹中获取路径。您的代码实际上没有设置工作目录。查看我的代码。;)我的代码假设水印图像与ffmpeg.exe位于同一目录中