ffmpeg не может преобразовать загруженный видеофайл, размер которого превышает 14 МБ, при выполнении через c # .net - PullRequest
1 голос
/ 16 ноября 2010

Я конвертирую видео в flv, используя ffmpeg.exe через c # , и процесс застревает, и преобразование завершается неудачно, если размер файла превышает 14 МБ .Я пытался запустить ffmpeg напрямую через командную строку, и он отлично работает независимо от размера .

Мой код преобразования выглядит следующим образом:

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();
 }

Когда я пыталсяЧтобы вручную остановить запущенный процесс stderroutput выглядит следующим образом:

FFmpeg версия SVN-r21231-Sherpya, Copyright (c) 2000-2010 Fabrice Bellard, et al.построено 16 января 2010 05:42:31 с gcc 4.2.5 20080919 (предварительный выпуск) [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 Ввод # 0, mov, mp4, m4a, 3gp, 3g2, mj2, из 'C: \ Project-Folder-Файлы \ ThirtySecondPitch \ video \ 7.mp_c88a8ec2-3a60-4133-aee6-7e2d93b62324.mp4 ': Метаданные: major_brand: isom minor_version: 512 compatibility_brands: isomiso2mp41 Продолжительность: 00: 00: 23.13, начало: 0.000000, бит / с: 926Поток # 0.0 (jpn): видео: mpeg4, yuv420p, 1280x720 [PAR 1: 1 DAR 16: 9], 9128 кбит / с, 30 тбр, 30 тбн, 30 тбк Поток # 0.1 (jpn): аудио: aac, 48000Гц, стерео, s16, 127 кбит / с Вывод # 0, flv, в 'C: \ Project-Folder-Files \ ThirtySecondPitch \ video \ SWF \ 7.mp_c88a8ec2-3a60-4133-aee6-7e2d93b62324.flv': поток #0.0 (jpn): видео: flv, yuv420p, 1280x720 [PAR 1: 1 DAR 16: 9], q = 2-31, 200 кбит / с, 1k tbn, 30 тбк Поток # 0.1 (jpn): аудио: libmp3lame,22050 Гц, стерео, s16, 64 кбит / с Отображение потока: Поток # 0,0 -> # 0,0 Поток # 0,1 -> # 0,1 Нажмите [q], чтобы остановить кодирование кадра = 19 к / с = 0 q = 1,0 размер = 596 кБ время = 0,50битрейт = 9839,2 кбит / с
кадр = 36 к / с = 33 q = 1,0 размер = 1284 кБ время = 1,07 bitrate = 9822,2 кбит / с
кадр = 55 к / с = 34 q = 1,0 размер = 2076 кБ время = 1,70 битрейта = 10013,6 ​​кбит / с
кадр = 74 к / с = 35 q = 1,0 размер = 2819 кБ время = 2,35 битрейта =9822,2 кбит / с
кадр = 93 к / с = 35 q = 1,0 размер = 3583 кБ время = 2,95 битрейта = 9943,3 кбит / с
кадр = 113 к / с = 36 q = 1,0 размер = 4457 кБ время = 3,63 битрейта = 10056,2 кбит/ с
кадр = 132 к / с = 36 q = 1,0 размер = 5157 кБ время = 4,26 битрейт = 9922,3 кбит / с
кадр = 152 к / с = 37 q = 1,0 размер = 5972 кБ время = 4,91 битрейт = 9961,6 кбит / с
кадр = 172 к / с = 37 q = 1,0 размер = 6817 кБ время = 5,62 битрейта = 9943,9 кбит / с
кадр = 192 к / с = 37 q = 1,0 размер = 7676 кБ время = 6,27 битрейта = 10030,1 кбит / с
кадр = 212 кадр / с = 37 q = 1,0 размер = 8488 кБ время = 6,92 битрейта = 10045,9 кбит / с
кадр = 232 кадр / с = 37 q = 1,0 размер = 9306 кБ времени = 7,58 битрейт = 10062,8 кбит / с
кадр= 251 кадр / с = 37 q = 1,0 размер = 10150 кБ время = 8,26 битрейт = 10072,1 кбит / с
кадр = 271 кадр / с = 37 q = 1,0 размер = 10970 кБ время = 8,88 битрейт = 10117,6 кбит / с
кадр = 291fps = 38 q = 1,0 размер = 11815kB время = 9,56 битрейт= 10123,7 кбит / с
кадр = 311 к / с = 38 q = 1,0 размер = 12625 кБ время = 10,24 битрейта = 10100,1 кбит / с
кадр = 331 к / с = 38 q = 1,0 размер = 13414 кБ время = 10,89 битрейта = 10088,0кбит / с
кадр = 351 кадр / с = 38 q = 1,0 размер = 14125 кБ время = 11,55 битрейт = 10021,7 кбит / с
кадр = 371 кадр / с = 38 q = 1,0 размер = 14929 кБ время = 12,25 битрейт = 9983,0 кбит / сс
кадр = 391 кадр / с = 38 q = 1,0 размер = 15701 кБ время = 12,90 битрейт = 9967,8 кбит / с
кадр = 411 кадр / с = 38 q = 1,0 размер = 16385 кБ время = 13,56 битрейт = 9899,9 кбит / с
кадр = 431 кадр / с = 38 q = 1,0 размер = 17137 кБ время = 14,21 битрейт = 9878,7 кбит / с
кадр = 451 кадр / с = 38 q = 1,0 размер = 17938 кБ время = 14,92 битрейт = 9851,7 кбит / с
кадр = 471 кадр / с = 38 q = 1,0 размер = 18663 кБ время = 15,57 битрейт = 9820,0 кбит / с
кадр = 491 кадр / с = 38 q = 1,0 размер = 19379 кБ время = 16,22 битрейт = 9786,4 кбит / с
кадр =511 к / с = 38 q = 1,0 размер = время 20179kB = 16,90 битрейта = 9780,9 кбит / с
кадр = 530 к / с = 38 q = 1,0 размер = 20893 кБ время = 17,53 битрейта = 9764,8 кбит / с
кадр = 550 к / с= 38 q = 1,0 размер = 21633 КБвремя = 18,18 битрейт = 9747,3 кбит / с
кадр = 570 кадров / с = 38 q = 1,0 размер = 22464 кБ время = 18,89 битрейта = 9743,5 кбит / с
кадр = 590 кадров / с = 38 q = 1,0 размер = 23227 кБ времени = 19,54 битрейта = 9737,7 кбит / с
кадр =609 к / с = 38 q = 1,0 размер = 23992 кБ время = 20,17 битрейт = 9745,8 кбит / с
кадр = 629 к / с = 38 q = 1,0 размер = 24804 кБ время = 20,85 битрейт = 9747,4 кбит / с
кадр = 648 к / с= 38 q = 1,0 размер = 25501 кБ время = 21,45 битрейта = 9740,6 кбит / с
кадр = 668 к / с = 38 q = 1,0 размер = 26306 кБ времени = 22,13 битрейта = 9739,7 кбит / с
кадр = 687 к / с = 38q = 1,0 размер = 27040 кБ время = 22,80 битрейта = 9713,2 кбит / с

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010

Проблема не в размере конвертируемого файла.

Вы пытаетесь выполнить два синхронных чтения до конца обоих перенаправленных потоков. Это может привести к тупику (я думаю, вы поймали его из-за размера файла лагера).

Итак, вы должны прокомментировать одну из следующих строк:

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

или чтение из одного из потоков асинхронно.

К вашему сведению: ffmpeg использует stderr для регистрации (предположим, вы хотите захватить вывод); и использует стандартный вывод для передачи двоичных данных (мультимедиа, снимки и т. д.). Поэтому я не вижу реальной причины для перенаправления stdout.

1 голос
/ 16 ноября 2010

Я думаю, что процесс должен завершаться преждевременно, если вы используете asp.net. У меня была эта проблема, и я решил создать службу, работающую на сервере, которая опрашивает новые файлы и выполняет преобразование. Работало хорошо, но вам нужен хотя бы виртуальный выделенный сервер, так как большинство общих хостов не позволяют запускать вашу службу ..

0 голосов
/ 10 ноября 2017

Как сказал Алекс, проблема, скорее всего, связана с командами ReadToEnd (), один из способов исправить это - создать обработчик события для печати строки всякий раз, когда возникает строка вывода или ошибки. Это будет означать, что вы не добавляете их все в буфер и (потенциально) не останавливаете процесс. Следующий код работал для меня, просто измените log.Info () на все, что вы хотите сделать со своим выводом и ошибкой

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();
0 голосов
/ 16 ноября 2010

Надеюсь, этот код будет вам полезен, пожалуйста, преобразуйте этот код в форму C # 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

после загрузки кода на сервер используйте это,

Dim RootPath As String = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...