- 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格式的视频文件。。。
视频格式转换:
-
<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)!