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

本文关键字:查找 路径 出错 ffmpeg net asp 应用程序 | 更新日期: 2023-09-27 18:29:23

我正在使用.net ffmpeg包装器在视频上发布水印。如果我直接执行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-2013FFmpeg开发人员于2013年8月24日21:40:51用gcc 4.7.3构建(GCC)配置:--enable gpl--enable-version 3--disable-w32线程--启用avisynth--启用bzlib--启用fontconfig--启用-frei0r--启用gnutls--启用iconv--启用libass--启用libbluray--启用libcaca--启用libfreetype--启用libgsm--启用libibc--启用libmodplug--启用-libmp3lame--启用libopencore amrnb--启用libopen core amrwb--启用libopenjpeg--启用libopus--启用librtmp--enable libschroedinger--enable libsoxr--enable librspeex--enable lib theora--enable ibtwolame--enable libvo aacen--enabled libvo amrwbenc--enable livorbis--enables libvpx--enable-libx264--enable-libxavs--enable利伯斯维德--enable zlib libavutil 52。42.100/52。42.100 libavcodec 55。29.100/55。29.100 libav格式55。55年2月14日。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。0年3月17日。17.103 libpostdoc 52。3.100/52。3.100[asf@024c9960]流#0:没有足够的帧来估计速率;考虑增加输入流的猜测信道布局问题

0.0:立体声输入#0,asf,来自"F:''own''mhp_new/contents/orgial''wildlife.wmv":元数据:

SfOriginalFPS:299700 WMFSDK版本:11.0.6001.7000所需WMFSDK:0.0.0.0万评论:视频:小世界制作公司;新西兰旅游|制作人:Gary F.Spradling |音乐:Steve Ball标题:HD中的野生动物版权所有:©2008 Microsoft Corporation IsVBR:0设备一致性模板:AP@L3持续时间:00:00:30.09,开始时间:0.000000,比特率:6977 kb/s流#0:0(eng):音频:wmav2(a1[0][0]/0x0161),44100 Hz,立体声,fltp,192 kb/s流

0:1(eng):视频: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]avformat_open_input失败'watermark.png'[AVFilterGraph@024ca100]初始化筛选器时出错参数为'watermark.png'的'movie'打开筛选器时出错!错误代码=0

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

i: 应用程序根

ii:实际aspx页面所在的根

iii:ffmpeg根

iv:ffmpeg/bin/

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

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

有人能帮我把水印.png文件放在哪里吗?这样脚本就可以访问它了。

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

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

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

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

  • 或者使代码集成为子流程的正确工作目录
  • 或者通过绝对路径引用文件。但是,请注意,您可能需要多次转义路径和命令行的其余部分(例如"''"或空格)

例如,以下是一个适用于我的完整示例:

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

哦,out.avi当然包含水印。)