java 使用 mencoder 视频处理

      mencoder 是一款命令行方式的视频处理软件,是Mplayer自带的编码工具(Mplayer是Linux下的播放器,开源,支持几乎所有视频格式的播放,有windows和Mac版本)。

   一 :  Mplayer的安装    

     Mplayer windows版本下载列表: http://www5.mplayerhq.hu/MPlayer/releases/win32/
                   linux版本直接在 : https://www5.mplayerhq.hu/MPlayer/releases/  下载
     Codecs下载列表: http://www5.mplayerhq.hu/MPlayer/releases/codecs/ 选择windows-all-********.zip(*表示年月日)下载,将zip包中的文件夹下所有文件,包括*.dll、*.acm、*.ax等等全部copy到Mplayer根目录下的codecs文件夹中。
     说明: 如果不下载Codes 直接处理视频会报错: ERROR: Could not open required DirectShow codec wmsdmod.dll. 等,如下图
       
     此时最好把Mplayer.exe所在路径,同时也是mencoder.exe所在路径添加到环境变量path中。
     现在可以试试用Mplayer播放视频,比如有个视频位于D:/mencoder/test.rmvb,那么可以打开一个cmd窗口,输入 mplayer “D:/mencoder/test.rmvb” 即可
 
二 :  使用 mencoder 的命令进行视频处理
       1.  视频转换
           命令格式:  mencoder.exe input.avi -o output.mp4 -oac mp3lame -lameopts cbr:br=32 -ovc x264 -x264encopts bitrate=440 -vf scale=648:460
           说明:
                  mencoder.exe     使用mencoder命令,windows在需要mencoder.exe目录否则需要带上具体路径,linux 直接使用 mencoder 即可
                  input.avi              输入的文件
                  -o                        输出文件参数,后接输出文件路径 
                  output.mp4         输出文件路径
                  -oac mp3lame    音频编码器使用 mp3lame , 其他可选值如下
                                                                                                                               
音频编码器名称描述
mp3lame 通过LAME编码为VBR,ABR或CBR格式的MP3文件
lavc 利用libavcodec中的一个编码器
faac FAAC AAC音频编码器
toolame MPEG音频Layer 2编码器
twolame 基于tooLAME的MPEG音频Layer 2编码器
pcm 未压缩的PCM音频
copy 不要重新编码,这是复制已压缩的各桢

               -lameopts cbr:br=32   设置mp3lamer的相关参数,设置音频固定码率32。编码方式包括有abr(按平均码率编码)、cbr(指固定码率编码)、vbr(按动态码率编码)三种。
               -ovc   x264                  视频编码器使用 x264 ,其他可选值如下:
                                                               
视频编码器名称描述
lavc 使用libavcodec中的一个是频编码器
xvid Xvid, MPEG-4高级简单格式(ASP)编码器
x264 x264, MPEG-4高级视频编码(AVC), AKA H.264编码器
nuv nuppel视频,为一些实时程序所用
raw 未压缩的视频桢
copy 不要重新编码,只是复制已压缩的各桢
frameno 用于三通道编码(不推荐)
                   

 

                -x264encopts bitrate=440  设置x264的相关参数,设置码率440

                -vf scale=648:460  设置视频宽度和高度 648是宽度, 460是高度, 这也可以压缩视频, 如果不想压缩, 可以不加这一段.

       补充:  以上参数为常规参数,资料有限无法全部收集起来,需自行百度,末尾会补充一些关于mencoder其他博主的博客,供大家参考

     2. 图片合并成视频

         命令格式:  mencoder mf://*.jpg -mf fps=1:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -audiofile aduio.mp3 -mc 0 -o file.avi

                          mencoder mf://*.JPG -mf fps=1:type=JPG -ovc x264 -x264encopts bitrate=440 -vf scale=640:480 -oac mp3lame -audiofile aduio.mp3 -mc 0 -o jpgR.mp4

                        mencoder mf://*.JPG -mf fps=1:type=JPG -ovc x264 -x264encopts bitrate=440 -vf scale=640:480 -o jpgR.mp4

          说明:

                          mf://*.jpg 是指当前目录下要合并的图片后缀名

                         -mf 内置参数

                          fps=1 是帧数,

                          type=jpg 要合并的图片的后缀名

                          -ovc 指定视频编码器

                          lavc 使用libavcodec中的一个视频编码器

                          -lavcopts 内置参数

                          vcodec=mpeg4 指定视频编码器

                          -oac 指定音频编码器

                          copy 复制原音频编码器和音频流

                          -o 输出文件

                          -ovc x264 指定视频编码器为x264,即mp4编码

                          -x264encopts 设置x264的参数。

                          bitrate=440 设置x264的视频的码率为440。

                          -vf scale=640:480 设置视频的宽度为640,高度为480

                          -audiofile aduio.mp3 输入一个音频文件

                          -mc 0 设置音视频同步,增这个参数可防止音频和视频出现不同步现象

    3. 视频翻转      
            命令格式:  

                mencoder -oac mp3lame -lameopts vol=10 -ovc lavc -vf rotate=1 VID_20130807_094228.3gp -o VID_20130807_094228.avi      

                mencoder -oac mp3lame -lameopts vol=10 -ovc x264 -x264encopts bitrate=440 -vf scale=640:480 rotate=1 VID_20130807_094228.3gp -o VID_20130807_094228.mp4

          说明:

                -oac 指定音频编码器

                mp3lame mp3的编码器

                -lameopts 指定mp3编码器的参数

                vol=10 音量放大

                rotate=1 翻转方向,应该是顺时针的, 1为90度右转, 2为180度右转.....

     4. 截取视频

           命令格式:  mencoder -ss 开始时间 -oac copy -ovc copy -endpos 截取时间长 文件名 -o 目标文件名

                             mencoder -ss 开始时间 -oac aac -ovc x264 -x264encopts bitrate=440 -vf scale=640:480 -mc 0 -endpos 截取时间长 文件名 -o 目标文件名

           说明: 

                -ss   设置转换开始时间,如:-ss 15 代表从视频的15秒开始截取

                -oac 指定音频编码器 copy 复制,不作改变 ; aac 指定音频编码器为aac

                -ovc 指定视频编码器 x264 mp4编码器

                -x264encopts 指定x264参数 bitrate=440 设置视频码率为440

                -vf scale=640:480 设置视频的宽度为640,高度为480

                -mc 0 设置音视频同步,增这个参数可防止音频和视频出现不同步现象

                -endpos 设置转换结束时间,如:-endpos 60 在视频的60秒处结束

                -o 输出选项

      5. 提取音频

           命令格式:  mencoder -oac mp3lame -ovc copy -of rawaudio 视频文件 -o 音频文件

           说明: 

                -of rawaudio 原始音频流

                -ovc copy 这个是复制视频, 但这里并没有复制视频, 因为-of rawaudio这个参数, 视频被放弃了.

      6. 提取视频

           命令格式:  mencoder -oac copy -ovc x264 -of rawvideo 视频文件 -o 输出的视频文件

           说明:

                   这个和提取音频类似, 但这个的音频被丢弃了. 没声音的. -of rawvideo 这个只用视频流

      7. 合成视频

           命令格式:   mencoder -ovc x264 -x264encopts bitrate=440 -vf scale=640:480 -oac mp3lame -mc 0 02.3gp 03.3gp -o updtp.mp4

                             mencoder 02.3gp 03.3gp -o updtp.mp4 -of lavf -vf lavcdeint -vf scale=640:480 -oac mp3lame 

           说明:

                            mp3lame   mp3编码器

                            aac 指定音频编码器为aac

                            -ovc 指定视频编码器 

                            x264 mp4编码器

                            -x264encopts 指定x264参数

                            bitrate=440 设置视频码率为440

                            -vf scale=640:480 设置视频的宽度为640,高度为480

                            -mc 0 设置音视频同步,增这个参数可防止音频和视频出现不同步现象

                            02.3gp 第一个文件 

                            03.3gp 第二个文件

                            -o updtp.mp4 输出合并后的文件

                            -vf lavcdeint   参数用于去除视频中的拉丝条纹

三 . 使用 java 执行 mencoder 命令操作视频

       一个简单的demo代码如下:(以视频格式转换为例)

private String videoConv() {  
        List<String> commend = new java.util.ArrayList<String>();  
        commend.add("mencoder.exe");  // mencoder 路径,linux下可直接使用 mencoder 
        commend.add("D:/input.avi");  // 源视频路径  
        commend.add("-o");  
        commend.add("D:/output.avi"); //输出视频路径  
        commend.add("-oac");          //设置音频编码  
        commend.add("mp3lame");       //设置音频编码器为mp3lame  
        commend.add("-lameopts");     //设置 mp3lame参数
        commend.add("preset=64");     //具体的音频编码器参数
        commend.add("-ovc");          //设置视频编码器
        commend.add("xvid");          //设置视频编码器为 xvid
        commend.add("-xvidencopts");  //设置xvid参数  
        commend.add("bitrate=600");   //具体xvid参数
        commend.add("-srate");        //设置音频采样率   
        commend.add("22050");         //设置音频采样率值22050 
        try {  
            ProcessBuilder builder = new ProcessBuilder();  
            builder.command(commend);  
            Process p = builder.start();  
            doWaitFor(p);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
} 

       关于视频转换的具体代码: 更好的封装请访问我的gitee,里面也包含了使用ffmpeg转换视频的方法,地址如下: 

       https://gitee.com/huaixiaonian/java-video

四. 更多资料

      关于java方式的视频转换,本人也是刚入门,如有错误,欢迎留言!

      开发过程中参考了一下的博客,链接如下,供大家参考:

         https://www.myzhenai.com.cn/post/2689.html

         http://www.cqyy.net/360/2022/0218/97998.html

         http://t.zoukankan.com/LUO257316-p-3220809.html

         https://www.cnblogs.com/bcfx/articles/2975419.html

         https://blog.csdn.net/yhguo2008/article/details/5940717

 

 

posted @ 2022-08-18 16:40  fy_qxl  阅读(548)  评论(0编辑  收藏  举报