简体   繁体   中英

ffmpeg fails to convert an uploaded video file whose size greater than 14mb when executed through c#.net

I am converting videos to flv using ffmpeg.exe through c# and the process gets stuck and the conversion fails if the file size exceeds 14mb . I've tried to run ffmpeg directly through command prompt and it works fine regardless of size .

My conversion code is as follows:

OutputFile = SavePath + "SWF\\" + WithOutExt + ".flv";
FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}",InputFile,OutputFile);

Process proc;
proc = new Process();

try
{
     proc.StartInfo.FileName = spath + "\\ffmpeg\\ffmpeg.exe";
     proc.StartInfo.Arguments = FilArgs;
     proc.StartInfo.UseShellExecute = false;
     proc.StartInfo.CreateNoWindow = false;
     proc.StartInfo.RedirectStandardOutput = true;
     proc.StartInfo.RedirectStandardError = true;
     proc.Start();

     string StdOutVideo = proc.StandardOutput.ReadToEnd();
     string StdErrVideo = proc.StandardError.ReadToEnd();
 }
 finally
 {
     proc.WaitForExit();
     proc.Close();
 }

When I tried to manually stop the running process The stderroutput is as follows:

FFmpeg version SVN-r21231-Sherpya, Copyright (c) 2000-2010 Fabrice Bellard, et al. built on Jan 16 2010 05:42:31 with gcc 4.2.5 20080919 (prerelease) [Sherpya] libavutil 50. 7. 0 / 50. 7. 0 libavcodec 52.47. 0 / 52.47. 0 libavformat 52.47. 0 / 52.47. 0 libavdevice 52. 2. 0 / 52. 2. 0 libavfilter 1.15. 0 / 1.15. 0 libswscale 0. 8. 0 / 0. 8. 0 libpostproc 51. 2. 0 / 51. 2. 0 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\\Project-Folder-Files\\ThirtySecondPitch\\video\\7.mp_c88a8ec2-3a60-4133-aee6-7e2d93b62324.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 Duration: 00:00:23.13, start: 0.000000, bitrate: 9261 kb/s Stream #0.0(jpn): Video: mpeg4, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 9128 kb/s, 30 tbr, 30 tbn, 30 tbc Stream #0.1(jpn): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s Output #0, flv, to 'C:\\Project-Folder-Files\\ThirtySecondPitch\\video\\SWF\\7.mp_c88a8ec2-3a60-4133-aee6-7e2d93b62324.flv': Stream #0.0(jpn): Video: flv, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 1k tbn, 30 tbc Stream #0.1(jpn): Audio: libmp3lame, 22050 Hz, stereo, s16, 64 kb/s Stream mapping: Stream #0.0 -> #0.0 Stream #0.1 -> #0.1 Press [q] to stop encoding frame= 19 fps= 0 q=1.0 size= 596kB time=0.50 bitrate=9839.2kbits/s
frame= 36 fps= 33 q=1.0 size= 1284kB time=1.07 bitrate=9822.2kbits/s
frame= 55 fps= 34 q=1.0 size= 2076kB time=1.70 bitrate=10013.6kbits/s
frame= 74 fps= 35 q=1.0 size= 2819kB time=2.35 bitrate=9822.2kbits/s
frame= 93 fps= 35 q=1.0 size= 3583kB time=2.95 bitrate=9943.3kbits/s
frame= 113 fps= 36 q=1.0 size= 4457kB time=3.63 bitrate=10056.2kbits/s
frame= 132 fps= 36 q=1.0 size= 5157kB time=4.26 bitrate=9922.3kbits/s
frame= 152 fps= 37 q=1.0 size= 5972kB time=4.91 bitrate=9961.6kbits/s
frame= 172 fps= 37 q=1.0 size= 6817kB time=5.62 bitrate=9943.9kbits/s
frame= 192 fps= 37 q=1.0 size= 7676kB time=6.27 bitrate=10030.1kbits/s
frame= 212 fps= 37 q=1.0 size= 8488kB time=6.92 bitrate=10045.9kbits/s
frame= 232 fps= 37 q=1.0 size= 9306kB time=7.58 bitrate=10062.8kbits/s
frame= 251 fps= 37 q=1.0 size= 10150kB time=8.26 bitrate=10072.1kbits/s
frame= 271 fps= 37 q=1.0 size= 10970kB time=8.88 bitrate=10117.6kbits/s
frame= 291 fps= 38 q=1.0 size= 11815kB time=9.56 bitrate=10123.7kbits/s
frame= 311 fps= 38 q=1.0 size= 12625kB time=10.24 bitrate=10100.1kbits/s
frame= 331 fps= 38 q=1.0 size= 13414kB time=10.89 bitrate=10088.0kbits/s
frame= 351 fps= 38 q=1.0 size= 14125kB time=11.55 bitrate=10021.7kbits/s
frame= 371 fps= 38 q=1.0 size= 14929kB time=12.25 bitrate=9983.0kbits/s
frame= 391 fps= 38 q=1.0 size= 15701kB time=12.90 bitrate=9967.8kbits/s
frame= 411 fps= 38 q=1.0 size= 16385kB time=13.56 bitrate=9899.9kbits/s
frame= 431 fps= 38 q=1.0 size= 17137kB time=14.21 bitrate=9878.7kbits/s
frame= 451 fps= 38 q=1.0 size= 17938kB time=14.92 bitrate=9851.7kbits/s
frame= 471 fps= 38 q=1.0 size= 18663kB time=15.57 bitrate=9820.0kbits/s
frame= 491 fps= 38 q=1.0 size= 19379kB time=16.22 bitrate=9786.4kbits/s
frame= 511 fps= 38 q=1.0 size= 20179kB time=16.90 bitrate=9780.9kbits/s
frame= 530 fps= 38 q=1.0 size= 20893kB time=17.53 bitrate=9764.8kbits/s
frame= 550 fps= 38 q=1.0 size= 21633kB time=18.18 bitrate=9747.3kbits/s
frame= 570 fps= 38 q=1.0 size= 22464kB time=18.89 bitrate=9743.5kbits/s
frame= 590 fps= 38 q=1.0 size= 23227kB time=19.54 bitrate=9737.7kbits/s
frame= 609 fps= 38 q=1.0 size= 23992kB time=20.17 bitrate=9745.8kbits/s
frame= 629 fps= 38 q=1.0 size= 24804kB time=20.85 bitrate=9747.4kbits/s
frame= 648 fps= 38 q=1.0 size= 25501kB time=21.45 bitrate=9740.6kbits/s
frame= 668 fps= 38 q=1.0 size= 26306kB time=22.13 bitrate=9739.7kbits/s
frame= 687 fps= 38 q=1.0 size= 27040kB time=22.80 bitrate=9713.2kbits/s

The problem is not in the size of file being converted.

You're trying to perform two synchronous read to the end of both redirected streams. This may cause a deadlock (my guess: you've caught it because of lager file size).

So you should to comment one of these lines:

string StdOutVideo = proc.StandardOutput.ReadToEnd();
string StdErrVideo = proc.StandardError.ReadToEnd();

or read from one of the streams asynchronously.

FYI: ffmpeg uses stderr for logging purposes (suppose, you want to capture the output); and uses stdout to pipe out binary data(multimedia, snapshots, etc.). So I don't see a real reason for stdout redirection.

I think the process must be terminating prematurely, if you're using asp.net. I had this problem, and what I did for a solution I did was to do a service that ran on the server, which polls for new files and does the conversion. Worked well, but you need at least a Virtual Dedicated server, since most shared hosts will not allow your service to run..

Hope this code is helpful to you, please convert this code to C# form vb.

Function convertotswf(ByVal imgName As String, ByVal iMaxId As Integer) As String
    Dim filename As String
    Dim _mhandler As New MediaHandler()

    Dim RootPath As String = System.Configuration.ConfigurationManager.AppSettings("SITE_ROOTPATH")

    _mhandler.FFMPEGPath = RootPath + System.Configuration.ConfigurationManager.AppSettings("ffmpegpath")
    _mhandler.InputPath = RootPath + System.Configuration.ConfigurationManager.AppSettings("TEMPVIDEO_ROOTPATH")
    _mhandler.OutputPath = RootPath + System.Configuration.ConfigurationManager.AppSettings("mediapath")
    _mhandler.FileName = imgName
    _mhandler.OutputFileName = iMaxId & ".flv"
    filename = iMaxId & ".flv"

    _mhandler.Video_Bitrate = System.Configuration.ConfigurationManager.AppSettings("flvvideobitrate")
    _mhandler.Audio_Bitrate = System.Configuration.ConfigurationManager.AppSettings("flvaudiobitrate")
    _mhandler.Audio_SamplingRate = System.Configuration.ConfigurationManager.AppSettings("flvsamplingrate")

    Dim info As VideoInfo = _mhandler.Encode_FLV()
    If info.ErrorCode > 0 Then
        If info.ErrorCode = 121 Then
            GoTo read
        End If
        Return "1"

    Else
    read:
        Dim mid_duration As String = System.Configuration.ConfigurationManager.AppSettings("flvmidduration")

        _mhandler.FFMPEGPath = RootPath & System.Configuration.ConfigurationManager.AppSettings("ffmpegpath")
        _mhandler.InputPath = RootPath + System.Configuration.ConfigurationManager.AppSettings("mediapath")
        _mhandler.OutputPath = RootPath + System.Configuration.ConfigurationManager.AppSettings("flvimagepath")
        _mhandler.FileName = filename
        _mhandler.Image_Format = "jpg"
        _mhandler.ImageName = iMaxId & ".jpg"
        _mhandler.Frame_Time = mid_duration
        _mhandler.Width = System.Configuration.ConfigurationManager.AppSettings("flvwidth")
        _mhandler.Height = System.Configuration.ConfigurationManager.AppSettings("flvheight")
        _mhandler.Grab_Thumb()
    End If

    Return filename
End Function

after uploading the code to the server use this,

Dim RootPath As String = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath)

As Alex said, the problem is likely the ReadToEnd() commands, one way to fix it is to create an event handler to print a line whenever an output or error line occurs. This will mean you don't add them all to a buffer and (potentially) make the process hang. The following code worked for me, just change log.Info() to whatever you want to do with your output and error

process.OutputDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
        log.Info("Output Line: "+e.Data);
    }
);
process.ErrorDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
        log.Info("Error Line: "+e.Data);
    }
);
//start process
process.Start();
log.Info("process started");
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM