使用FFmpeg将视频编码格式转化为H264编码

2023-05-16

背景介绍:

    web开发中涉及到视频播放的前端一般会使用h5的video标签对后端提供的视频文件url直接加载进行播放,虽然视频文件后缀都是mp4,但并非所有视频文件的编码格式都支持用video播放,目前支持的格式有以下几种:

MP4 = MPEG4文件使用H264视频编解码器和AAC音频编解码器
WebM = WebM文件使用VP8视频编解码器和Vorbis音频编解码器
Ogg =   Ogg文件使用Theora视频编解码器和Vorbis音频编解码器

当视频文件不支持video标签播放时需要将其格式用编码工具转化为支持的格式。
    本文是通过Java调用FFmpeg命令将MPEG编码格式转化为H264格式,当视频文件比较少时可以采用播放器软件(QQ影音就可以)来转。

Linux下安装FFmpeg

  • 先安装yasm
# 下载yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
# 解压
tar -xzvf yasm-1.3.0.tar.gz
# 配置安装
cd yasm-1.3.0
./configure
make
make install
  • 编译安装H264模块
# 下载x264
git clone https://code.videolan.org/videolan/x264.git
# 切换到x264目录
cd x264
# --prefix=/usr/local/x264 指定安装目录,这里不要指定,否则会出现库找不到的问题
# 执行配置
./configure --enable-shared --enable-static --enable-yasm
# 编译安装
make & make install
  • 安装FFmpeg
# 下载
wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2
tar -jxvf ffmpeg-4.2.2.tar.bz2
cd ffmpeg-4.2.2
# 安装
./configure --enable-gpl --enable-libx264
make & make insatll

注:以上安装都没有指定安装路径,即为默认路径,无需为FFmpeg添加系统变量,找不到h264模块时应该做入下配置项

  • 修改系统库的配置
vim vim /etc/ld.so.conf
# 添加以下行
/usr/local/lib
# 保存退出后执行以下命名使lib库生效
ldconfig
  • 测试ffmpeg是否安装成功
ffmpeg -version

显示如下即为安装成功
在这里插入图片描述

Java调用系统FFmpeg命令实现转码

/**
     * 调用系统命令转码每个文件
     * @param inputFile 输入视频文件路径
     * @param outputDir 输出目录路径
     */
private static void transferToH264(File inputFile,File outputDir){
        if (!outputDir.exists()){
            outputDir.mkdirs();
        }
        String outputFile = outputDir.getPath()+"/"+inputFile.getParent();
        File outDir = new File(outputFile);
        if(!outDir.exists()){
            outDir.mkdirs();
        }
        System.out.println(outputFile+"/"+inputFile.getName());
        outputFile = outputFile+"/"+inputFile.getName();
        String command = "ffmpeg -threads 5 -i " + inputFile.getAbsolutePath() + " -vcodec libx264 -preset ultrafast -r 29 -s 1920x1080 "+outputFile;
        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;

            while ( (line = br.readLine()) != null)
                System.out.println(line);

            int exitVal = proc.waitFor();
            System.out.println("Process exitValue: " + exitVal);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

FFmpeg常用命令以及参数

-i 指定要转换视频的源文件
-s 视频转换后视频的分辨率
-vcodec 视频转换时使用的编解码器(-codecs)
-r 视频转换换的桢率(默认25桢每秒)
-b 视频转换换的bit率
-ab 音频转换后的bit率(默认64k)
-acodec 制定音频使用的编码器(-codecs)
-ac 制定转换后音频的声道
-ar 音频转换后的采样率
-an 禁用音频
-vn 禁用视频
-acodec copy 复制音频,不转码
-vcodec copy 复制视频,不转码
# 设置参数转
ffmpeg -i 88885.mp4 -vcodec h264 -r 29 -b:v 43382k 88885_h264.mp4
# 直接转码
# 视频文件转化为h264编码格式,直接转为h264编码格式
ffmpeg -i 88885.mp4 -vcodec h264 88885_h264.mp4
  • FFmpeg转码速率问题
    转码默认参数比较慢,可以指定以下参数来选择合适的速率。
ultrafast:最快的编码方式
superfast:超级快速的编码方式
veryfast:非常快速的编码方式
faster:稍微快速的编码方式
fast:快速的编码方式
medium:折中的编码方式
slow:慢的编码方式
slower:更慢的编码方式
veryslow:非常慢的编码方式
placebo:最慢的编码方式

更多参数请参考这篇文章和官方提供的文档
https://www.jianshu.com/p/49fcae61e58c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用FFmpeg将视频编码格式转化为H264编码 的相关文章

  • #华为mate8公开版解bl锁避免踩雷的事项

    华为mate8公开版解bl锁避免踩雷的注意事项 最近一个朋友 xff08 64 djkaguya xff09 出于某些原因需要将他此型号的备用机解bl锁来迁移服务 xff0c 此篇文章用来记述他在折腾过程中总结出的注意事项 整体流程 1 华
  • qt 修改背景颜色 的几种方法

    按钮方式切换一种颜色 span class token keyword void span MainWindow span class token operator span span class token operator span s
  • 什么是底层驱动程序

    底层驱动是程序以访问底层硬件的形式实现人机交互 xff0c 驱动程序和应用程序之间需要实现相应的信息交互 xff0c 一方面 xff0c 应用程序通过对驱动程序发送相应的指令 xff0c 实现 硬件控制的动作指令 xff0c 另一 方面 x
  • Spring Security 401 问题解决

    背景 xff1a 微服务接口调用的时候报错 xff0c 原来有一个rest服务用的不多 xff0c 平时用的都是一些基础的服务 xff0c 然后客户需要我们开放一个外部接口给他们 xff0c 然后我寻思着就在这里面写接口 然后调用的时候就报
  • ubuntu源不可用

    如果使用ubuntu系统时 xff0c 发现之前的源不可用 xff0c 使用命令 sudo gedit span class token operator span etc span class token operator span ap
  • keras UpSampling2D/3D

    UpSampling2D 看tf文档中的解析 xff1a tf keras layers UpSampling2D xff1a Upsampling layer for 2D inputs 在一个2D输入中进行上采样操作 xff0c 其实就
  • C#winform实现窗口及窗口内容自动缩放(代码已封装)

    c 窗体实现等比例缩小放大 代码如下 原出处为某问答中看到的 摘录下来 以免遗忘 原文地址已附上 如有侵权请联系我 本文仅供学习交流 按我个人理解 setControl函数应当使用多线程加速 本人只是新手 就不画蛇添足了 欢迎各位大佬补正
  • 在移植boa服务器的过程中出现boa:not found问题以及移植cgic库编译时出现arm-linux-gcc-g命令未找到错误

    1 嵌入式web服务器移植的过程在网上很多资源的 xff0c 我在这就不再赘述了 xff0c 我就简单说下一个对于新手来说很头疼的问题 xff01 xff01 移植boa服务器的时候 xff0c 所有的编译工作以及移植工作全部做完了 xff
  • 详解JavaScript异步与回调

    一 前言 在学习本文内容之前 xff0c 我们必须要先了解异步的概念 xff0c 首先要强调的是异步和并行有着本质的区别 并行 xff0c 一般指并行计算 xff0c 是说同一时刻有多条指令同时被执行 xff0c 这些指令可能执行于同一CP
  • Linux上VNC 启动和关闭 ( 解决 Ubuntu16.04 sncserver连接出现Timed out waiting for a response from the computer)

    原文 https blog csdn net russle article details 4757888 整体思路 xff1a 查看vncserver端口 是否开启 xff08 手动kill vncserver进程有坑 xff0c 有时再
  • Ubuntu各个版本下载

    官网 xff1a https www ubuntu com download desktop 没找到历史版本 xff0c 且下载速度很慢 在网易镜像站下载ubuntu xff1a 网址 xff1a http mirrors 163 com
  • C++ vector 内存分配与回收机制

    最近开始更加深入的学习C 43 43 xff0c 发现了很多以前没注意到但是很重要的知识点 这篇文章主要说vector内存机制和效率问题 1 vector内存增长 vector所有的内存相关问题都可以归结于它的内存增长策略 vector有一
  • [简约webAPI]php连接MSsql server的五种方法总结

    参考了下php官方手册总结了五种PHP连接MSsql server的方法 mssql 系列函数 sqlsrv 系列函数 odbc方式连接sqlserver PDO方式连接sqlserver COM方式连接 参考php手册 xff0c 对ph
  • idea中activiti的属性设置界面不见了

    idea中activiti的属性设置界面不见了 解决方法 xff1a 1 关闭bpmn文件 xff0c 重新打开 xff0c 点击流程图编辑器 xff0c 就会出现相关节点的属性了 2 http www yayihouse com yayi
  • Spring 中最常用的 11 个扩展点

    目录 1 自定义拦截器 2 获取Spring容器对象 2 1 BeanFactoryAware接口 2 2 ApplicationContextAware接口 3 全局异常处理 4 类型转换器 5 导入配置 5 1 普通类 5 2 配置类
  • 前端页面播放直播流flv

    1 html代码 lt DOCTYPE html gt lt html gt lt head gt lt meta http equiv 61 34 Content Type 34 content 61 34 text html chars
  • java分片处理List集合数据

    java分批次处理List集合数据 解决方法 xff1a 1 用法 以下代码假如datas有10000个元素 xff0c 每次分批处理1000个元素 xff0c 那么以下datasub stream forEach会执行10次 List l
  • linux curl卡住问题

    linux curl调用的接口执行完卡住没响应问题 解决方法 xff1a 以下命令就是有时会阻塞 xff0c 影响后面命令执行 xff1a curl d 34 point 61 2 34 http 10 248 254 199 8080 p
  • idea替换的快捷键

    idea替换快捷键 解决方法 xff1a ctrl 43 r 当前文件内容替换 xff0c 指的是在当前打开的文件中替换匹配的字符 xff0c 只操作一个文件 如果想在选定的目录下或者类包下查找替换 xff1a http www yayih
  • 成功解决Cannot open database "xxx" requested by the login.The login failed

    连接sqlserver数据库报错信息入下所示 xff1a Cannot open database 34 xxx 34 requested by the login The login failed 解决方法 xff1a http www

随机推荐