直播软件开发中的音视频编码转换怎么实现

2.1、下载ffmpeg。
下载网址:[url]http://www.ffmpeg.org/download.html[/url]

2.2、解压缩

    tar -zxvf ffmpeg-2.0.1.tar.gz



2.3、编辑profile文件:
vi /etc/profile
在文件末尾加上两句话:

        export FFMPEG_HOME=/usr/local/ffmpeg 
        export PATH=$FFMPEG_HOME/bin:$PATH



2.4、配置安装路径之类的:

    ./configure --enable-shared --prefix=/usr/local/ffmpeg
    --enable-shared 参数据说是允许其编译产生动态库,在以后的编程中要用到这个几个动态库,我也没考证,就直接用了。
   如果出现异常,提示因为缺少yasm,需要添加参数,再执行以下命令:
    ./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg
    如果执行结果不对,可以根据提示信息,并查看帮助,解决问题
    ./configure --help



2.5、编译安装

    make
    make install


2.6、安装之后在/usr/local/ffmpeg会看到有三个目录

    bin 执行文件目录
    lib 静态,动态链接库目录
    include 编程用到的头文件


2.7、为了防止执行程序找不到库文件,

    可以将/usr/local/ffmpeg/lib目录设置到LD_LIBRARY_PATH环境变量



8、若出现error while loading shared libraries: libavdevice.so.52的错误

    修改/etc/ld.so.conf 在最后一行加上/usr/local/ffmpeg/lib
    ldconfig -v
    并修改 /usr/local/ffmpeg/lib目录下的文件权限为777



[b]3.shell脚本命令转换[/b]

./ffmpeg -i source.amr dest.mp3



[b]4.ffmpeg自带转换[/b]

/**
 * useFfmpegToMp3
 *
 * @param ffmpeg
 * @param source
 * @param target
 */
public static void useFfmpegToMp3(String ffmpeg, String source, String target){
    Runtime run = null;
    try {
        long start=System.currentTimeMillis();
        run = Runtime.getRuntime();
        //设置文件运行权限
        run.exec(new String[] { "/bin/chmod", "755", ffmpeg});
        String runCmd = ffmpeg + " -i " + source + " " +  target;
        //运行命令
        Process proc = run.exec(runCmd);
        proc.getOutputStream().flush();
        proc.getOutputStream().close();
        proc.getInputStream().close();
        LOGGER.info("Dest File Size:{}", new File(target).length());
        long end=System.currentTimeMillis();
        LOGGER.info("useFfmpegToMp3 Complete:{} -> {}, cost ms:{}", source, target, end-start);
    } catch (Exception e) {
        LOGGER.error("useJaveToMp3 Exception: ", e);
    } finally{
        //run调用lame解码器最后释放内存
        run.freeMemory();
    }
}



[b]5.Jave转换[/b]

下载地址:[url]http://www.sauronsoftware.it/projects/jave/download.php[/url]

 
/**
 * jave 转换mp3
 *
 * @param source
 * @param target
 */
public static void useJaveToMp3(String source, String target) {

    try {
        long start=System.currentTimeMillis();
        File sourceFile = new File(source);
        File targetFile = new File(target);
        AudioAttributes audio = new AudioAttributes();
        Encoder encoder = new Encoder();
        audio.setCodec("libmp3lame");
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("mp3");
        attrs.setAudioAttributes(audio);
        encoder.encode(sourceFile, targetFile, attrs);
        LOGGER.info("Dest File Size:{}", targetFile.length());
        long end=System.currentTimeMillis();
        LOGGER.info("useJaveToMp3 Complete:{} -> {}, cost ms:{}", source, target, end-start);
    }catch (Exceptio){
        LOGGER.error("useJaveToMp3 Exception: ", e);
    }

}


备注:
如果自带的FFmpeg转码报错,编译最新的ffmpeg,执行就可以了
官方示例:

 //From a generic AVI to a youtube-like FLV movie, with an embedded MP3 audio stream:

 File source = new File("source.avi");
 File target = new File("target.flv");
 AudioAttributes audio = new AudioAttributes();
 audio.setCodec("libmp3lame");
 audio.setBitRate(new Integer(64000));
 audio.setChannels(new Integer(1));
 audio.setSamplingRate(new Integer(22050));
 VideoAttributes video = new VideoAttributes();
 video.setCodec("flv");
 video.setBitRate(new Integer(160000));
 video.setFrameRate(new Integer(15));
 video.setSize(new VideoSize(400, 300));
 EncodingAttributes attrs = new EncodingAttributes();
 attrs.setFormat("flv");
 attrs.setAudioAttributes(audio);
 attrs.setVideoAttributes(video);
 Encoder encoder = new Encoder();
 encoder.encode(source, target, attrs);

 //Next lines extracts audio informations from an AVI and store them in a plain WAV file:

 File source = new File("source.avi");
 File target = new File("target.wav");
 AudioAttributes audio = new AudioAttributes();
 audio.setCodec("pcm_s16le");
 EncodingAttributes attrs = new EncodingAttributes();
 attrs.setFormat("wav");
 attrs.setAudioAttributes(audio);
 Encoder encoder = new Encoder();
 encoder.encode(source, target, attrs);
// Next example takes an audio WAV file and generates a 128 kbit/s, stereo, 44100 Hz MP3 file:

 File source = new File("source.wav");
 File target = new File("target.mp3");
 AudioAttributes audio = new AudioAttributes();
 audio.setCodec("libmp3lame");
 audio.setBitRate(new Integer(128000));
 audio.setChannels(new Integer(2));
 audio.setSamplingRate(new Integer(44100));
 EncodingAttributes attrs = new EncodingAttributes();
 attrs.setFormat("mp3");
 attrs.setAudioAttributes(audio);
 Encoder encoder = new Encoder();
 encoder.encode(source, target, attrs);
// Next one decodes a generic AVI file and creates another one with the same video stream of the source and a re-encoded low quality MP3 audio stream:

 File source = new File("source.avi");
 File target = new File("target.avi");
 AudioAttributes audio = new AudioAttributes();
 audio.setCodec("libmp3lame");
 audio.setBitRate(new Integer(56000));
 audio.setChannels(new Integer(1));
 audio.setSamplingRate(new Integer(22050));
 VideoAttributes video = new VideoAttributes();
 video.setCodec(VideoAttributes.DIRECT_STREAM_COPY);
 EncodingAttributes attrs = new EncodingAttributes();
 attrs.setFormat("avi");
 attrs.setAudioAttributes(audio);
 attrs.setVideoAttributes(video);
 Encoder encoder = new Encoder();
 encoder.encode(source, target, attrs);
 //Next one generates an AVI with MPEG 4/DivX video and OGG Vorbis audio:

 File source = new File("source.avi");
 File target = new File("target.avi");
 AudioAttributes audio = new AudioAttributes();
 audio.setCodec("libvorbis");
 VideoAttributes video = new VideoAttributes();
 video.setCodec("mpeg4");
 video.setTag("DIVX");
 video.setBitRate(new Integer(160000));
 video.setFrameRate(new Integer(30));
 EncodingAttributes attrs = new EncodingAttributes();
 attrs.setFormat("mpegvideo");
 attrs.setAudioAttributes(audio);
 attrs.setVideoAttributes(video);
 Encoder encoder = new Encoder();
 encoder.encode(source, target, attrs);
// A smartphone suitable video:

 File source = new File("source.avi");
 File target = new File("target.3gp");
 AudioAttributes audio = new AudioAttributes();
 audio.setCodec("libfaac");
 audio.setBitRate(new Integer(128000));
 audio.setSamplingRate(new Integer(44100));
 audio.setChannels(new Integer(2));
 VideoAttributes video = new VideoAttributes();
 video.setCodec("mpeg4");
 video.setBitRate(new Integer(160000));
 video.setFrameRate(new Integer(15));
 video.setSize(new VideoSize(176, 144));
 EncodingAttributes attrs = new EncodingAttributes();
 attrs.setFormat("3gp");
 attrs.setAudioAttributes(audio);
 attrs.setVideoAttributes(video);
 Encoder encoder = new Encoder();
 encoder.encode(source, target, attrs);

热门文章

暂无图片
编程学习 ·

音频格式介绍和说明

零、音频压缩的原理音频文件压缩的原理很简单:因为有冗余信息,因此可以压缩。主要有两种方式实现:频谱掩蔽效应: 人耳所能察觉的声音信号的频率范围为20Hz~20KHz,在这个频率范围以外的音频信号属于冗余信号,属于可操作。时域掩蔽效应: 当强音信号和弱音信号同时出现时,…
暂无图片
编程学习 ·

销售分析 II

题目描述:Table: Product+--------------+---------+ | Column Name | Type | +--------------+---------+ | product_id | int | | product_name | varchar | | unit_price | int | +--------------+---------+ product_id 是这张表的主键 Table: Sales+----…
暂无图片
编程学习 ·

centos7.5通过yum安装docker

1.docker安装 1.安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-utils:yum管理工具包 device-mapper-persistent-data:设备映射包 lvm2:lvm包 2.安装docker源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/cent…
暂无图片
编程学习 ·

如何重命名data.frame中的单个列?

本文翻译自:How to rename a single column in a data.frame? I know if I have a data frame with more than 1 column, I can use 我知道如果我有一个多于一列的数据框,我可以使用 colnames(x) <- c("col1","col2")to rename the columns. 重命名…
暂无图片
编程学习 ·

Java并发编程之深入理解volatile

个人博客请访问 http://www.x0100.top 1. 保证可见性volatile保证了不同线程对volatile修饰变量进行操作时的可见性。对一个volatile变量的读,(任意线程)总是能看到对这个volatile变量最后的写入。一个线程修改volatile变量的值时,该变量的新值会立即刷新到主内存中,…
暂无图片
编程学习 ·

虚拟机VMware安装学习过程中遇到的几个问题

1.在安装VMware的时候刚开始因为版本不足的原因,电脑显示 Failed to initialize ploicy for cpu 后来我把它复制到百度上发现是我电脑版本过高的原因,于是又下载了VMware15.5.1版本 又查找了它的破解版。2.在安装的过程中还出现过屏幕就一个-,然后什么都不出现,于是查找资…
暂无图片
编程学习 ·

转 C++常用设计模式

适配器模式可以将一个类的接口转换成客户端希望的另一个接口,使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作。通俗的讲就是当我们已经有了一些类,而这些类不能满足新的需求,此时就可以考虑是否能将现有的类适配成可以满足新需求的类。适配器类需要继承或依…
暂无图片
编程学习 ·

flutter textfield设置高度后内容无法居中

Container(height: 50,width: MediaQuery.of(context).size.width * 2 / 3,alignment: Alignment.center,child: TextField(autofocus: true,decoration: InputDecoration(//这行代码是关键,设置这个之后,居中contentPadding: EdgeInsets.all(2),hintText: 请输入手机号,pref…
暂无图片
编程学习 ·

windows10系统-2-安装Nodejs及SocketIO

(1)双击node-v12.14.1-x64.msi CMD>npm --version查看npm的版本 CMD>npm -v (2)使用淘宝镜像的命令 CMD>npm install -g cnpm --registry=https://registry.npm.taobao.org CMD>npm list -g查看所有全局安装的模块 【全局安装所在路径C:\Users\user\AppData\Roamin…
暂无图片
编程学习 ·

流量记录和回放n2disk

n2disk™是网络流量记录器应用程序。n2disk™是具有索引功能的10/40 Gbit网络流量记录器。使用n2disk™,您可以从实时网络接口以几Gigabit速率(在足够的硬件上以10 Gigabit / s以上)捕获全尺寸的网络数据包,并将其写入文件中而不会丢失任何数据包。n2disk™旨在将文件长时间…
暂无图片
编程学习 ·

quartus ii 使用modelsim altera进行仿真

第一种:先随便写一个程序,有输入,有时钟,有输出再点击processing-->start-->start test bench template writer然后就会在modlsim的文件中生成一个.vt的文件 然后打开这个文件接下来就是再initial和always里面添加信号保存,再点击首先看仿真软件是不是modelsin-altera,再…
暂无图片
编程学习 ·

Spring测试中的事务

目录 文章目录@Transactional @Transactional 1、测试方法加上该注解后事务自动回滚。 2、@BeforeEach与@AfterEach在测试方法的事务中执行 3、@BeforeTransactional与@AfterTransactional在事务执行之前之后执行;并且没有加@Transactional的测试方法不执行这两个注解下的方法…
暂无图片
编程学习 ·

数据库语句和数据库表常用的操作命令

Mysql的启动与关闭启动 net start mysql关闭 net stop mysql显示当前服务器版本 SELECT NERSION();显示当前的日期 SWLECT NOW();显示当前用户 SELECT USER(); 数据库语句(DDL)查看数据库 show databases;创建数据库 create database demo;查看警告信息 show warnings;查…
暂无图片
编程学习 ·

Java数据类型

数据类型 Java属于一种强类型语言 什么是强类型语言? 即要求变量的使用需要严格符合规定,要求所有变量都必须先定义后再使用,若不按规定就会报错! Java的数据类型分为两类 基本类型(primitive type) Java语言提供了八种基本类型:六种数字类型(四个整数型,两个浮点型),…
暂无图片
编程学习 ·

free_spirit(在栈上爆破一个可以被free的fake_chunk)

free_spirit(在栈上爆破一个可以被free的fake_chunk)首先检查一下程序的保护机制然后,我们用IDA分析一下,功能3存在8字节溢出,将会把v7下面的buf指针覆盖掉,而覆盖了buf指针,就能实现任意地址写。那么,我们劫持函数栈返回地址为one_gadget即可,为了绕过结尾对buf的检查…
暂无图片
编程学习 ·

11.1 函数的默认参数

11.1 函数的默认参数 之前我们学过的,如果函数由形参,那么调用函数时要传递对性的实参。 事实上,函数可以有默认参数,这样如果不传递实参,则按照默认值给形参传值。函数声明和实现只能有一个默认参数,不能重复定义默认参数。 如果某个形参有了默认参数,则位于这个形参之…
暂无图片
编程学习 ·

Java数据结构--顺序栈

一、简介 1.1 概念栈:又称为堆栈,是限制在表的一端进行插入和删除的线性表。其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。 表中进行插入、删除操作的一端称为栈顶、栈顶保存的元素称为栈顶元素。相对的,表的另一端称为栈底…
暂无图片
编程学习 ·

强推#vue图片预览组件—v-viewer

强推#vue图片预览组件—v-viewer 先来介绍一下背景 项目是用vue搭的,产品给的需求是:图片列表展示,要求点击图片可以放大。 原本就是写了一个弹出框,包裹相应图片就算完成了,但是!!! 作为一个善于思考的前端娃,我一定要考虑更加全面哇,因为这些图片是病人的病历拍照上…
暂无图片
编程学习 ·

String类、Arrays类

String类 概念:之前都已经接触到了String的对象,是一个字符串。String类就代表的是字符串 特点 1.双引号引起来的"abc",这种也是String对象,这种对象不是保存到堆中而是方法区的常量池中 2.字符串对象是不可变的对象,只要你观察到字符串的内容变化了,那么肯定是…
暂无图片
编程学习 ·

JAVA笔记[2]20200701

JAVA笔记【2】对象与类继承 对象与类LocalDate类;static LocalTime now() 构造一个表示当前日期的对象 static LocalTime of(int year,int month,int day) 构造一个表示给定日期的对象 int getYear() int getMonthValue() int getDayOfMonth() 得到当前日期的年、月和日 DayOf…