当前位置:首页 > 操作系统 > Windows

windows下使用ffmpeg进行视频转换和截图。

  1. author:fanfq(xiaoban)

Email:fangqing.fan#gmail.com
link:http://fanfq.iteye.com/admin/blogs/655569
changelog:
有很多朋友发邮件问我关于ffmpeg视频转码的相关问题,我也尝试了帮助他们去解决这些问题,由于个人精力有限就blog上总结一下大家所遇到的一些问题。
以下代码只要是使用的我的包是肯定没有问题的,但是至限于*-》flv,因为不同格式的视频转码所对应的参数也是不一样的,想要达到效果教好的视频的话就得修改这些参数,但是我们有一个通用的方式,只要是ffmpeg支持的视频的话。使用 ffmpeg -i form.** to.** 就可以了,但是这只局限与测试。
windows环境测试
一.磨刀不误砍柴工
1.ffmpeg下载地址:https://ffmpeg.zeranoe.com/builds/,下载解压如下图所示:

技术分享

在C:盘下创建一个文件夹C:ffmpeg,然后将上面截图的内容复制进去。

ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等),
可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式;
mencoder.exe;drv43260.dll;pncrt.dll这3个文件是为文件格式(wmv9,rm,rmvb等)
转换为avi(ffmpeg能解析的)格式准备的;再把转换好的avi文件再用ffmpeg.exe转换成flv格式的视频文件。。。

视频格式转换:

  1.                     <span>  1</span>
                        <span>import</span>
                        <span> java.io.File;
    </span>
                        <span>  2</span>
                        <span>import</span>
                        <span> java.util.ArrayList;
    </span>
                        <span>  3</span>
                        <span>import</span>
                        <span> java.util.Calendar;
    </span>
                        <span>  4</span>
                        <span>import</span>
                        <span> java.util.List;
    </span>
                        <span>  5</span>
                        <span>  6</span>
                        <span>public</span>
                        <span>class</span>
                        <span> Test {
    </span>
                        <span>  7</span>
                        <span>private</span>
                        <span>final</span>
                        <span>static</span> String PATH = "c:ffmpeginputc.mp4"<span>;
    </span><span>  8</span><span>  9</span><span>public</span><span>static</span><span>void</span><span> main(String[] args) {
    </span><span> 10</span><span>if</span> (!<span>checkfile(PATH)) {
    </span><span> 11</span>             System.out.println(PATH + " is not file"<span>);
    </span><span> 12</span><span>return</span><span>;
    </span><span> 13</span><span>        }
    </span><span> 14</span><span>if</span><span> (process()) {
    </span><span> 15</span>             System.out.println("ok"<span>);
    </span><span> 16</span><span>        }
    </span><span> 17</span><span>    }
    </span><span> 18</span><span> 19</span><span>private</span><span>static</span><span>boolean</span><span> process() {
    </span><span> 20</span><span>int</span> type =<span> checkContentType();
    </span><span> 21</span><span>boolean</span> status = <span>false</span><span>;
    </span><span> 22</span><span>if</span> (type == 0<span>) {
    </span><span> 23</span>             System.out.println("直接将文件转为flv文件"<span>);
    </span><span> 24</span>             status = processFLV(PATH);<span>//</span><span> 直接将文件转为flv文件</span><span> 25</span>         } <span>else</span><span>if</span> (type == 1<span>) {
    </span><span> 26</span>             String avifilepath =<span> processAVI(type);
    </span><span> 27</span><span>if</span> (avifilepath == <span>null</span><span>)
    </span><span> 28</span><span>return</span><span>false</span>;<span>//</span><span> avi文件没有得到</span><span> 29</span>             status = processFLV(avifilepath);<span>//</span><span> 将avi转为flv</span><span> 30</span><span>        }
    </span><span> 31</span><span>return</span><span> status;
    </span><span> 32</span><span>    }
    </span><span> 33</span><span> 34</span><span>private</span><span>static</span><span>int</span><span> checkContentType() {
    </span><span> 35</span>         String type = PATH.substring(PATH.lastIndexOf(".") + 1<span>, PATH.length()).toLowerCase();
    </span><span> 36</span><span>//</span><span> ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)</span><span> 37</span><span>if</span> (type.equals("avi"<span>)) {
    </span><span> 38</span><span>return</span> 0<span>;
    </span><span> 39</span>         } <span>else</span><span>if</span> (type.equals("mpg"<span>)) {
    </span><span> 40</span><span>return</span> 0<span>;
    </span><span> 41</span>         } <span>else</span><span>if</span> (type.equals("wmv"<span>)) {
    </span><span> 42</span><span>return</span> 0<span>;
    </span><span> 43</span>         } <span>else</span><span>if</span> (type.equals("3gp"<span>)) {
    </span><span> 44</span><span>return</span> 0<span>;
    </span><span> 45</span>         } <span>else</span><span>if</span> (type.equals("mov"<span>)) {
    </span><span> 46</span><span>return</span> 0<span>;
    </span><span> 47</span>         } <span>else</span><span>if</span> (type.equals("mp4"<span>)) {
    </span><span> 48</span><span>return</span> 0<span>;
    </span><span> 49</span>         } <span>else</span><span>if</span> (type.equals("asf"<span>)) {
    </span><span> 50</span><span>return</span> 0<span>;
    </span><span> 51</span>         } <span>else</span><span>if</span> (type.equals("asx"<span>)) {
    </span><span> 52</span><span>return</span> 0<span>;
    </span><span> 53</span>         } <span>else</span><span>if</span> (type.equals("flv"<span>)) {
    </span><span> 54</span><span>return</span> 0<span>;
    </span><span> 55</span><span>        }
    </span><span> 56</span><span>//</span><span> 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
    </span><span> 57</span><span>//</span><span> 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.</span><span> 58</span><span>else</span><span>if</span> (type.equals("wmv9"<span>)) {
    </span><span> 59</span><span>return</span> 1<span>;
    </span><span> 60</span>         } <span>else</span><span>if</span> (type.equals("rm"<span>)) {
    </span><span> 61</span><span>return</span> 1<span>;
    </span><span> 62</span>         } <span>else</span><span>if</span> (type.equals("rmvb"<span>)) {
    </span><span> 63</span><span>return</span> 1<span>;
    </span><span> 64</span><span>        }
    </span><span> 65</span><span>return</span> 9<span>;
    </span><span> 66</span><span>    }
    </span><span> 67</span><span> 68</span><span>private</span><span>static</span><span>boolean</span><span> checkfile(String path) {
    </span><span> 69</span>         File file = <span>new</span><span> File(path);
    </span><span> 70</span><span>if</span> (!<span>file.isFile()) {
    </span><span> 71</span><span>return</span><span>false</span><span>;
    </span><span> 72</span><span>        }
    </span><span> 73</span><span>return</span><span>true</span><span>;
    </span><span> 74</span><span>    }
    </span><span> 75</span><span> 76</span><span>//</span><span> 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.</span><span> 77</span><span>private</span><span>static</span> String processAVI(<span>int</span><span> type) {
    </span><span> 78</span>         List<String> commend = <span>new</span> ArrayList<String><span>();
    </span><span> 79</span>         commend.add("c:ffmpegmencoder"<span>);
    </span><span> 80</span><span>        commend.add(PATH);
    </span><span> 81</span>         commend.add("-oac"<span>);
    </span><span> 82</span>         commend.add("lavc"<span>);
    </span><span> 83</span>         commend.add("-lavcopts"<span>);
    </span><span> 84</span>         commend.add("acodec=mp3:abitrate=64"<span>);
    </span><span> 85</span>         commend.add("-ovc"<span>);
    </span><span> 86</span>         commend.add("xvid"<span>);
    </span><span> 87</span>         commend.add("-xvidencopts"<span>);
    </span><span> 88</span>         commend.add("bitrate=600"<span>);
    </span><span> 89</span>         commend.add("-of"<span>);
    </span><span> 90</span>         commend.add("avi"<span>);
    </span><span> 91</span>         commend.add("-o"<span>);
    </span><span> 92</span>         commend.add("c:ffmpegoutputa.avi"<span>);
    </span><span> 93</span><span>try</span><span> {
    </span><span> 94</span>             ProcessBuilder builder = <span>new</span><span> ProcessBuilder();
    </span><span> 95</span><span>            builder.command(commend);
    </span><span> 96</span><span>            builder.start();
    </span><span> 97</span><span>return</span> "c:ffmpegoutputa.avi"<span>;
    </span><span> 98</span>         } <span>catch</span><span> (Exception e) {
    </span><span> 99</span><span>            e.printStackTrace();
    </span><span>100</span><span>return</span><span>null</span><span>;
    </span><span>101</span><span>        }
    </span><span>102</span><span>    }
    </span><span>103</span><span>104</span><span>//</span><span> ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)</span><span>105</span><span>private</span><span>static</span><span>boolean</span><span> processFLV(String oldfilepath) {
    </span><span>106</span><span>if</span> (!<span>checkfile(PATH)) {
    </span><span>107</span>             System.out.println(oldfilepath + " is not file"<span>);
    </span><span>108</span><span>return</span><span>false</span><span>;
    </span><span>109</span><span>        }
    </span><span>110</span><span>//</span><span> 文件命名</span><span>111</span>         Calendar c =<span> Calendar.getInstance();
    </span><span>112</span>         String savename = String.valueOf(c.getTimeInMillis()) + Math.round(Math.random() * 100000<span>);
    </span><span>113</span>         List<String> commend = <span>new</span> ArrayList<String><span>();
    </span><span>114</span>         commend.add("c:ffmpegffmpeg"<span>);
    </span><span>115</span>         commend.add("-i"<span>);
    </span><span>116</span><span>        commend.add(oldfilepath);
    </span><span>117</span>         commend.add("-ab"<span>);
    </span><span>118</span>         commend.add("56"<span>);
    </span><span>119</span>         commend.add("-ar"<span>);
    </span><span>120</span>         commend.add("22050"<span>);
    </span><span>121</span>         commend.add("-qscale"<span>);
    </span><span>122</span>         commend.add("8"<span>);
    </span><span>123</span>         commend.add("-r"<span>);
    </span><span>124</span>         commend.add("15"<span>);
    </span><span>125</span>         commend.add("-s"<span>);
    </span><span>126</span>         commend.add("600x500"<span>);
    </span><span>127</span>         commend.add("c:ffmpegoutputa.flv"<span>);
    </span><span>128</span><span>try</span><span> {
    </span><span>129</span>             Runtime runtime =<span> Runtime.getRuntime();
    </span><span>130</span>             Process proce = <span>null</span><span>;
    </span><span>131</span>             String cmd = ""<span>;
    </span><span>132</span>             String cut = "     c:ffmpegffmpeg.exe   -i   " +<span> oldfilepath
    </span><span>133</span>                     + "   -y   -f   image2   -ss   8   -t   0.001   -s   600x500   c:ffmpegoutput" + "a.jpg"<span>;
    </span><span>134</span>             String cutCmd = cmd +<span> cut;
    </span><span>135</span>             proce =<span> runtime.exec(cutCmd);
    </span><span>136</span>             ProcessBuilder builder = <span>new</span><span> ProcessBuilder(commend);
    </span><span>137</span><span>            builder.command(commend);
    </span><span>138</span><span>            builder.start();
    </span><span>139</span><span>return</span><span>true</span><span>;
    </span><span>140</span>         } <span>catch</span><span> (Exception e) {
    </span><span>141</span><span>            e.printStackTrace();
    </span><span>142</span><span>return</span><span>false</span><span>;
    </span><span>143</span><span>        }
    </span><span>144</span><span>    }
    </span><span>145</span> }

     

技术分享

视频截图:

            <span>import</span>
            <span> java.io.IOException;
</span>
            <span>import</span>
            <span> java.io.InputStream;
</span>
            <span>import</span>
            <span> java.util.List;

</span>
            <span>public</span>
            <span>class</span>
            <span> Ffmpeg {
    </span>
            <span>public</span>
            <span>static</span>
            <span>void</span>
            <span> main(String[] args) {
        </span>
            <span>//</span>
            <span> 视频文件</span>
        String videoRealPath = "E:Eclipse2a.avi"<span>;
        </span><span>//</span><span> 截图的路径(输出路径)</span>
        String imageRealPath = "E:Eclipse2atest.jpg"<span>;

        </span><span>//</span><span> 方法一:调用批处理程序,调用批处理文件ffmpeg.bat转换视频格式
        </span><span>//</span><span> try {
        </span><span>//</span><span>//</span><span>调用批处理文件
        </span><span>//</span><span> Runtime.getRuntime().exec("cmd /c start
        </span><span>//</span><span> C:UsersAdministratorDesktoptestffmpeg.bat " + videoRealPath
        </span><span>//</span><span> + " " + imageRealPath);
        </span><span>//</span><span> } catch (IOException e) {
        </span><span>//</span><span>//</span><span> TODO Auto-generated catch block
        </span><span>//</span><span> e.printStackTrace();
        </span><span>//</span><span> }

        </span><span>//</span><span> 方法二:通过命令提示符来调用需要添加系统路径(Path),调用menconder转换视频各种
        </span><span>//</span><span> commendF
        </span><span>//</span><span> .add("cmd.exe /c mencoder E:Eclipse2test.flv -o
        </span><span>//</span><span> e:Eclipse2test.avi
        </span><span>//</span><span> -oac mp3lame -lameopts cbr:br=32
        </span><span>//</span><span> -ovc x264 -x264encopts bitrate=440 -vf scale=448:-3");

        </span><span>//</span><span> 方法三:调用系统中的可执行程序调用ffmpeg 提取视屏缩略图</span>
        List<String> commend = <span>new</span> java.util.ArrayList<String><span>();
        commend.add(</span>"E:Eclipse2Mplayerffmpeg-git-4082198-win32-staticbinffmpeg.exe"<span>);
        commend.add(</span>"-i"<span>);
        commend.add(videoRealPath);
        commend.add(</span>"-y"<span>);
        commend.add(</span>"-f"<span>);
        commend.add(</span>"image2"<span>);
        commend.add(</span>"-ss"<span>);
        commend.add(</span>"8"<span>);
        commend.add(</span>"-t"<span>);
        commend.add(</span>"0.001"<span>);
        commend.add(</span>"-s"<span>);
        commend.add(imageRealPath);
        </span><span>try</span><span> {

            ProcessBuilder builder </span>= <span>new</span><span> ProcessBuilder();

            builder.command(commend);

            builder.redirectErrorStream(</span><span>true</span><span>);

            System.out.println(</span>"视频截图开始..."<span>);

            </span><span>//</span><span> builder.start();</span><span>
            Process process </span>=<span> builder.start();

            InputStream in </span>=<span> process.getInputStream();

            </span><span>byte</span>[] re = <span>new</span><span>byte</span>[1024<span>];

            System.out.print(</span>"正在进行截图,请稍候"<span>);

            </span><span>while</span> (in.read(re) != -1<span>) {

                System.out.print(</span>"."<span>);

            }

            System.out.println(</span>""<span>);

            in.close();

            System.out.println(</span>"视频截图完成..."<span>);

        } </span><span>catch</span><span> (Exception e) {

            e.printStackTrace();

            System.out.println(</span>"视频截图失败!"<span>);

        }
    }
}</span>

 

 

原文:http://www.cnblogs.com/zhangqian1031/p/6114158.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐