FFMPEG转换视频在HTML5中不起作用

时间:2015-03-11 05:21:36

标签: c# asp.net-mvc html5 video ffmpeg

  

使用FFMPEG将Avi转换为Mp4,转换后的视频无法在html中运行   5< video>标签

我的网页上有一个部分,用户可以上传任何格式的任何类型的视频,目前仅限于.mp4和.avi。成功上传后,我向用户显示了相同的视频。我已经绑定了HTML5视频中的路径,以便用户可以查看他/她已经上传的内容。带有 .mp4 扩展名的视频无疑可以正常工作,因为 HTML5 支持它们。棘手的部分是它不支持Avi文件。现在问题出现了。为了显示avi视频,我使用 FFMPEG 将带有.avi扩展名的视频转换为.mp4。通过大量的谷歌搜索和阅读论坛,我已成功将avi视频转换为mp4。这是我用过的: -

  1. ffmpeg -i input.avi -acodec libfaac -b:a 128k -vcodec mpeg4 -b:v 1200k -flags +aic+mv4 output.mp4

  2. ffmpeg -i input.avi -c:v libx264 -b:a 128k -vcodec mpeg4 -b:v 1200k -flags +aic+mv4 output.mp4

  3. 以上两个工作正常,他们已经成功转换了视频。但是当我在HTML5和新标签(安装了Flash Player插件)的浏览器上运行它们时,HTML5无法播放它并且Flash播放器返回错误消息“因为文件损坏而无法播放视频”。但是当我在 KMplayer Window媒体播放器中播放它们时,它们运行得非常好。

    我去过stackoverflow中的各种线程,将avi转换为mp4,在这里我发现了一个论坛。其中一个用户已经接受了这个正确的答案,但它没有为我解决。

    1. ffmpeg -y -i sample.avi -b:v 1500k -vcodec libx264 -vpre slow -vpre baseline -g 30 sample.mp4
    2. 上面的参数返回了我的错误“文件预设'慢'未找到”。

      在我的进一步搜索之后,我遇到了这个帖子ffmpeg convert mov file to mp4 for HTML5 video tag IE9。以下参数完美地运行,并且能够以在浏览器上播放的方式转换视频。

      1. ffmpeg -y -i input.avi -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -vf scale=-1:480 -threads 0 -acodec libvo_aacenc -b:a 128k -pix_fmt yuv420p output.mp4
      2. 我在这里遇到的问题是视频转换为420p reso,其质量不高于标记。较小的分辨率视频已被放大并且似乎像素化

        因此,我不得不提出一个问题。如果有人能为上述问题提供解决方案,我将非常感激。我需要将avi视频转换为HTML5视频标签支持的mp4。它应该能够在浏览器上播放,在视频转换期间,它应该保持原始的音频和视频质量以及分辨率。

        谢谢

        我的C#代码:

                public void Create(string input, string output, string parametri, string ThumbnailPhysicalPath, int ConvertType)
                {
                    ffmpeg = new Process();
        
                    if (ConvertType == Convert.ToInt32(ConversionType.Thumbnail))
                        ffmpeg.StartInfo.Arguments = " -i \"" + input + "\" -vframes 1 \"" + output + "\"";
                    else if (ConvertType == Convert.ToInt32(ConversionType.AviToMp4))
                        ffmpeg.StartInfo.Arguments = " -i \"" + input + "\" -c:v libx264 -b:a 128k -vcodec mpeg4 -b:v 1200k -flags +aic+mv4 \"" + output + "\"";
                        //ffmpeg.StartInfo.Arguments = " -i \"" + input + "\" -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -vf scale=-1:480 -threads 0 -acodec libvo_aacenc -b:a 128k -pix_fmt yuv420p \"" + output + "\"";
                    ffmpeg.StartInfo.FileName = ThumbnailPhysicalPath + @"ffmpeg.exe";
                    ffmpeg.StartInfo.UseShellExecute = false;
                    ffmpeg.StartInfo.RedirectStandardOutput = true;
                    ffmpeg.StartInfo.RedirectStandardError = true;
                    ffmpeg.StartInfo.CreateNoWindow = true;
                    try
                    {
                        ffmpeg.Start();
                        ffmpeg.WaitForExit();
                        string error = ffmpeg.StandardError.ReadToEnd();
                    }
                    catch (Exception Ex)
                    {
                        Common.WriteLog("Exception occurred during conversion. Error Message :- " + Ex.Message + "\n Input Parameter :- " + input+ "\n Output Paramenter :- "+ output);
                    }
                    finally
                    {
                        ffmpeg.Close();
                        if (ConvertType == Convert.ToInt32(ConversionType.AviToMp4))
                            UpdateConvertedVideoDetails(input,output);
                    }
                }
        

        命令提示符FFMPEG输出: -

        样本3结果: -

        D:\Client\WebSite\Converter_Tools>ffmpeg -y -i sample.avi -b:v 1500k -vcodec libx264 -vpre slow -vpre baseline -g 30 sample.mp4
        ffmpeg version N-70239-g111d79a Copyright (c) 2000-2015 the FFmpeg developers
          built with gcc 4.9.2 (GCC)
          configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libblu
        ray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrw
        b --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --
        enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enab
        le-zlib
          libavutil      54. 19.100 / 54. 19.100
          libavcodec     56. 26.100 / 56. 26.100
          libavformat    56. 23.105 / 56. 23.105
          libavdevice    56.  4.100 / 56.  4.100
          libavfilter     5. 11.101 /  5. 11.101
          libswscale      3.  1.101 /  3.  1.101
          libswresample   1.  1.100 /  1.  1.100
          libpostproc    53.  3.100 / 53.  3.100
        [avi @ 037c8480] non-interleaved AVI
        Guessed Channel Layout for  Input Stream #0.1 : mono
        Input #0, avi, from 'sample.avi':
          Duration: 00:00:34.00, start: 0.000000, bitrate: 1433 kb/s
            Stream #0:0: Video: cinepak (cvid / 0x64697663), rgb24, 320x240, 15 fps, 15 tbr, 15 tbn, 15 tbc
            Stream #0:1: Audio: pcm_u8 ([1][0][0][0] / 0x0001), 22050 Hz, 1 channels, u8, 176 kb/s
        File for preset 'slow' not found
        

        样本4结果: -

        D:\Client\WebSite\Converter_Tools>ffmpeg -y -i input.avi -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -vf scale=-1:480 -threads 0 -acodec libvo_
        aacenc -b:a 128k -pix_fmt yuv420p output.mp4
        ffmpeg version N-70239-g111d79a Copyright (c) 2000-2015 the FFmpeg developers
          built with gcc 4.9.2 (GCC)
          configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libblu
        ray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrw
        b --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --
        enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enab
        le-zlib
          libavutil      54. 19.100 / 54. 19.100
          libavcodec     56. 26.100 / 56. 26.100
          libavformat    56. 23.105 / 56. 23.105
          libavdevice    56.  4.100 / 56.  4.100
          libavfilter     5. 11.101 /  5. 11.101
          libswscale      3.  1.101 /  3.  1.101
          libswresample   1.  1.100 /  1.  1.100
          libpostproc    53.  3.100 / 53.  3.100
        Input #0, avi, from 'input.avi':
          Duration: 00:00:03.93, start: 0.000000, bitrate: 3255 kb/s
            Stream #0:0: Video: msrle ([1][0][0][0] / 0x0001), pal8, 300x250, 3301 kb/s, 15 fps, 15 tbr, 15 tbn, 15 tbc
        [libx264 @ 002ec860] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
        [libx264 @ 002ec860] profile High, level 2.2
        [libx264 @ 002ec860] 264 - core 144 r2525 40bb568 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=5 deblock=1:0:0 analyse=0x3:0x113 me=umh subm
        e=8 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
        nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenecut=40 intra_refresh=0 rc_lookahead=50 rc
        =cbr mbtree=1 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=500 vbv_bufsize=1000 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
        Output #0, mp4, to 'output.mp4':
          Metadata:
            encoder         : Lavf56.23.105
            Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 576x480, q=-1--1, 500 kb/s, 15 fps, 15360 tbn, 15 tbc
            Metadata:
              encoder         : Lavc56.26.100 libx264
        Stream mapping:
          Stream #0:0 -> #0:0 (msrle (native) -> h264 (libx264))
        Press [q] to stop, [?] for help
        frame=   59 fps= 30 q=-1.0 Lsize=     229kB time=00:00:03.80 bitrate= 493.5kbits/s
        video:227kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.637976%
        [libx264 @ 002ec860] frame I:3     Avg QP:26.53  size: 10657
        [libx264 @ 002ec860] frame P:25    Avg QP:30.49  size:  5608
        [libx264 @ 002ec860] frame B:31    Avg QP:32.26  size:  1935
        [libx264 @ 002ec860] consecutive B-frames: 22.0% 16.9% 20.3% 40.7%
        [libx264 @ 002ec860] mb I  I16..4: 16.7% 69.0% 14.4%
        [libx264 @ 002ec860] mb P  I16..4: 11.1% 29.9%  3.8%  P16..4: 21.3%  6.8%  2.6%  0.0%  0.0%    skip:24.6%
        [libx264 @ 002ec860] mb B  I16..4:  1.7%  3.0%  0.3%  B16..8: 29.7%  5.6%  0.8%  direct: 2.1%  skip:56.8%  L0:50.5% L1:45.6% BI: 3.9%
        [libx264 @ 002ec860] 8x8 transform intra:66.5% inter:79.4%
        [libx264 @ 002ec860] direct mvs  spatial:93.5% temporal:6.5%
        [libx264 @ 002ec860] coded y,uvDC,uvAC intra: 40.3% 48.8% 25.7% inter: 12.4% 8.4% 1.4%
        [libx264 @ 002ec860] i16 v,h,dc,p: 19% 59%  6% 17%
        [libx264 @ 002ec860] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10% 25% 16%  7%  8%  6% 11%  7% 10%
        [libx264 @ 002ec860] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 21%  9%  7%  9%  8% 10%  7% 10%
        [libx264 @ 002ec860] i8c dc,h,v,p: 41% 33% 13% 13%
        [libx264 @ 002ec860] Weighted P-Frames: Y:0.0% UV:0.0%
        [libx264 @ 002ec860] ref P L0: 67.6%  8.1%  9.6%  5.4%  6.6%  2.8%
        [libx264 @ 002ec860] ref B L0: 84.6% 10.5%  3.9%  1.0%
        [libx264 @ 002ec860] ref B L1: 95.9%  4.1%
        [libx264 @ 002ec860] kb/s:472.20
        

1 个答案:

答案 0 :(得分:0)

问题1:HTML5不支持MPEG-4 Part 2视频

命令#1正在使用编码器mpeg4。 HTML5不支持生成的视频格式。请改用libx264

命令#2声明libx264mpeg4。这没有任何意义,因为您每个输出视频流只能选择一个编码器,并且由于最后列出了mpeg4,这可能是使用的编码器。

问题2:使用-preset代替过时的-vpre

我在这里指的是你的命令#3。

使用libx264进行编码时,请使用-preset而不是旧-vpre选项。 -preset将访问内部x264预设。 -vpre用于访问基于文本文件的自定义预设。

尝试使用H.264配置文件时使用-profile:v代替-vpre,例如-profile:v baseline

问题3:升级错误

  

较小的分辨率视频已放大并且似乎已经像素化。

为什么要高档?升级会降低质量。想象一下,将小尺寸图像缩放到较大尺寸。它看起来很糟糕,因为必须将现有信息插入到新的大小。神奇地放大图像并使其看起来像原始图像是不可能的。因为信息根本不存在。

问题#4:Internet Explorer

我不知道为什么IE没有播放命令#4的输出,但是就我所知,添加-movflags +faststart的建议似乎已经解决了。编码完成后,此选项会将某些数据重定位到文件的开头,以便在完全下载之前开始播放。但是,你的输入只有大约3秒的时间,所以它不应该有太大的不同。

如果您仍然遇到问题,可以尝试使用某些配置文件,例如baselinemain,具体取决于您的目标浏览器或设备可以解码的内容。