写点什么

linux【redhat&ubuntu】下 ffmpeg-3.1 安装编译及视频转码

发布于: 2 小时前
linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码

​一 ffmpeg 安装

1.1 基于源码进行编译安装

wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz

tar -zxvf ffmpeg-3.1.tar.gz

cd ffmpeg-3.1

./configure --prefix=/usr/local/ffmpeg

make && make install

等待安装完成...

配置环境变量:

vi /etc/profile

在最后 PATH 添加环境变量:PATH=$PATH:/usr/local/ffmpeg/binexport PATH 保存退出

source /ect/profile 设置生效

ffmpeg -version 查看版本


1.2 yasm

若安装过程中出现以下错误:

yasm/nasm not found or too old. Use –disable-yasm for a crippled build.

If you think configure made a mistake, make sure you are using the latestversion from Git. If the latest version fails, report the problem to theffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.Include the log file “config.log” produced by configure as this will helpsolve the problem.


如错误提示,yasm 未安装或者版本太老了,需要安装新版的 yasm

yasm 安装方法:

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

tar -zxvf yasm-1.3.0.tar.gz

cd yasm-1.3.0

./configure

make && make install

1.3 其他问题

问题:在其他机器安装时,还遇到了下面的几个问题,可供参考:


1、使用./configure 时,出现:


If gcc is a cross-compiler, use the --enable-cross-compile option.Only do this if you know what cross compiling means.C compiler test failed.If you think configure made a mistake, make sure you are using the latestversion from Git.  If the latest version fails, report the problem to theffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.Include the log file "config.log" produced by configure as this will helpsolve the problem.提示是 gcc 的问题,并提示了可以查看 config.log。cat config.log 查看错误信息如下【这里只粘贴最后的错误信息】:


END /tmp/ffconf.A6YIvVF3.cgcc -c -o /tmp/ffconf.kvhyNUCz.o /tmp/ffconf.A6YIvVF3.c./configure: line 875: gcc: command not foundC compiler test failed.显然,是没有找到 gcc 命令。。 通过 yum 或 apt-get 命令安装即可,之后再进行./configure ,便可以继续安装


2、运行./configure 会报错,错误提示为:  configure: error: C++ preprocessor “/lib/cpp” sanity check  check See `config.log’ for more details


解决办法:出现该情况是由于 c++编译器的相关 package 没有安装,在终端上执行:  $ sudo yum install glibc-headers gcc-c++


windows 下的编译步骤,参考:http://blog.csdn.net/zhouyongku/article/details/44961447


二 视频转码命令

由于需求的来源是要把 h264 裸流转换成 mp4,好供前端页面进行播放(js 的视频播放器支持的格式比较有限。。由于开发时间紧张,所以也没有足够的经历自己开发或找到现成的播放器,所以暂时只能采用编码的方案)。

2.1 ffmpeg 命令:264 转 mp4

ffmpeg -i slamtv60.264 -vcodec copy -f mp4 test.mp4

执行中打印的信息如下:

ffmpeg version 3.1 Copyright (c) 2000-2016 the FFmpeg developersbuilt with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11)configuration: --prefix=/usr/local/ffmpeglibavutil 55. 27.100 / 55. 27.100libavcodec 57. 48.101 / 57. 48.101libavformat 57. 40.101 / 57. 40.101libavdevice 57. 0.101 / 57. 0.101libavfilter 6. 46.102 / 6. 46.102libswscale 4. 1.100 / 4. 1.100libswresample 2. 1.100 / 2. 1.100Input #0, h264, from 'slamtv60.264':Duration: N/A, bitrate: N/AStream #0:0: Video: h264 (Main), yuv420p, 384x288, 25.50 fps, 25.50 tbr, 1200k tbn, 51 tbcFile 'test.mp4' already exists. Overwrite ? [y/N] y[mp4 @ 0x3913260] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.Output #0, mp4, to 'test.mp4':Metadata:encoder : Lavf57.40.101Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 384x288, q=2-31, 25.50 fps, 25.50 tbr, 1200k tbn, 1200k tbcStream mapping:Stream #0:0 -> #0:0 (copy)Press [q] to stop, [?] for help[mp4 @ 0x3913260] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properlyframe= 1479 fps=0.0 q=-1.0 Lsize= 4890kB time=00:00:58.31 bitrate= 687.0kbits/s speed=2.41e+03x


video:4884kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.139057%


转换速度还是很快的,5M 的一个.264 文件,转换成 mp4 耗时在毫秒级。【不过是在配置较高的机器,x86_64,8 核内存 20G 的服务器】


2.2 提取视频缩略图

ffmpeg -i 001709270738_1514337636497_3393223176.H264 -y -f image2 -t 0.001 -s 352x240 a.jpg

上述指令,是从 H264 文件中,提取一个尺寸为 352x240 大小的 jpg 图片文件,作为缩略图。

三 Java 代码调用命令

使用的还是简单的 java 中执行 shell 命令的方法,考虑到都在 java 中实现的话可以在一个任务中完成操作,不必在使用 shell 衔接,增加复杂度。

代码如下:

package schedule;
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;
public class FfmpegTranscode {
public static void runCmd(String command) { try { Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(command); InputStream stderr = proc.getErrorStream(); InputStreamReader isr = new InputStreamReader(stderr); BufferedReader br = new BufferedReader(isr); String line = null; System.out.println("<LogInfo>"); while ((line = br.readLine()) != null){ System.out.println(line); } System.out.println("</LogInfo>"); int exitVal = proc.waitFor(); System.out.println("Process exitValue: " + exitVal); } catch (Exception e) { e.printStackTrace(); }
}
public static void main(String[] args) { if(args.length<2) { System.out.println("请输入源文件和输出文件位置,源文件为264,输出mp4! "); return; } String h264Path = args[0]; String mp4Path = args[1]; System.out.println("执行转码:"+h264Path +" "+mp4Path); String videoCommand = "ffmpeg -i " +h264Path +" -vcodec copy -f mp4 " +mp4Path; System.out.println(videoCommand); runCmd(videoCommand);
}}
复制代码

执行时,需要在有 ffmpeg 的环境下运行。可以打成 jar 包后,上传到上面已安装 ffmpeg 的机器,通过命令:

java -jar ffmpegtools.jar ./slamtv60.264 ./slamtv60.mp4 的方式执行(slamtv60.264 替换成自己的 264 文件)

四 流数据转换【待续-研究中】

虽然上面已经实现了文件的转换,但更希望可以直接针对流数据进行处理,可以减少存储文件和读取的时间;直接把 h264 的流处理成 mp4 流后再写入指定位置。这个后续再继续调研,包括 H265 编码。


发布于: 2 小时前阅读数: 3
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码