短视频利器 ffmpeg (2)

发布于:2024-06-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

ffmpeg 官网这样写到

Converting video and audio has never been so easy.

如何轻松简单的使用:

1、下载

官网:http://www.ffmpeg.org

安装参考文档:
https://blog.csdn.net/qq_36765018/article/details/139067654

2、安装

# 启用RPM Fusion仓库。你可以选择免费或非免费仓库。对于ffmpeg,你通常需要免费仓库。
sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm

# 启用仓库后,你可以安装ffmpeg:
sudo yum install ffmpeg

#通过检查ffmpeg版本来验证安装:
ffmpeg -version

ffmpeg version 3.4.13 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44)

libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100

#如果在使用RPM Fusion仓库时遇到任何问题,你可以尝试使用--enablerepo选项来显式指定仓库:
#sudo yum --enablerepo=rpmfusion-free install ffmpeg

3、使用场景

3.1 视频格式转换

手机主流视频格式:
"mp4", "avi", "rmvb",
苹果手机默认是 mov : (需要把这种格式进行格式转换)

# 格式转换,先转为mp4 然后再进行处理

仅将其流式传输到Adobe Premiere Pro 等一些应用程序所需的新容器(mp4)而不编码 (fast)的命令为
ffmpeg -i input.mov -qscale 0 output.mp4

注释中提到的替代,它以最佳质量(-qscale 0)重新编码
ffmpeg -i fengj.mov -q:v 0 fengj.mp4

3.2、视频切图片(缺点是文件有点大,比原视频还大)

从视频文件或gif图片中逐帧提取图片,并加上编号。(很有意思,这里演示视频格式,gif图片你可以试下。)
ffmpeg -i video.mp4 frame_%d.png

4、提取视频文件指定时间点的1帧,下面演示的是提取第2秒的1帧。
ffmpeg -ss 00:02 -i fengj.mp4 -frames 1  -f image2 fengj0002.png

3.3、给视频加文字水印,颜色为红色,水印内容为LinuxTime。水印位置对应命令中的x轴和y轴。(待验证)

ffmpeg -hwaccel cuvid -i fengj1.mp4 -c:v libx264 -c:a copy  -vf "drawtext=fontfile=zh.ttf:text='LinuxTime':x=1200:y=900:fontsize=50:fontcolor=red:shadowy=2" fengj2.mp4

3.4、视频切片

ffmpeg -y -i shouye_202462117216.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb video_xiongmao/shouye.ts

ffmpeg -i video_xiongmao/shouye.ts -c copy -map 0 -f segment -segment_list video_xiongmao/shouye.m3u8 -segment_time 1 video_xiongmao/shouye-%04d.ts

4、shell 脚本编写

如需要使用 java 或者其他语言调用 这个软件,执行相关命令,则可以编写如下脚本。方便调用

4.1、视频文件转ts容器,根据不同的视频编码,确定使用不同的 比特流过滤器

#!/bin/bash

# chmod +x convert_mp4_to_ts.sh
# 检查是否提供了两个参数
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 input.mp4 output.ts"
    exit 1
fi

# 获取输入和输出文件名
input_file="$1"
output_file="$2"

# 期待的视频编码
expected_codec="h264"

# 使用ffprobe获取视频编码
actual_codec=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$input_file")

# 检查编码类型
if [ "$actual_codec" = "$expected_codec" ]; then
    echo "The video is encoded with H.264."
    # 使用ffmpeg转换视频:将MP4文件转换为TS格式
    ffmpeg -y -i "$input_file" -vcodec copy -acodec copy -vbsf h264_mp4toannexb "$output_file"
else
    echo "The video is NOT encoded with H.264. It is encoded with $actual_codec."
    ffmpeg -y -i "$input_file" -c:v libx264 -preset veryfast -crf 23 -c:a aac -b:a 128k -movflags +faststart "$output_file"
fi

# 检查ffmpeg执行结果
if [ $? -eq 0 ]; then
    echo "Video conversion successful."
else
    echo "Video conversion failed. Check the logs for more information."
fi

4.2、将ts 容器进行切片

#!/bin/bash

# 文件可执行 chmod +x convert_video.sh
# 检查是否提供了三个参数
if [ "$#" -ne 3 ]; then
    echo "Usage: $0 input.ts output.m3u8 output.ts"
    exit 1
fi

# 获取输入和输出文件名
input_file="$1"
m3u8_file="$2"
output_file="$3"

# 使用ffmpeg转换视频: 将 ts 文件进行切片,并输出为 m3u8 文件和 切片文件
ffmpeg -y -i "$input_file" -c copy -map 0 -f segment -segment_list "$m3u8_file" -segment_time 1 "$output_file"

# 检查ffmpeg执行结果
if [ $? -eq 0 ]; then
    echo "Video conversion successful."
else
    echo "Video conversion failed. Check the logs for more information."
fi

5、java 中如何调用

  public static void main(String[] args) {

        executeCommandForScript(Arrays.asList("sh", "/xxxx.sh", "sourceFile", "outputFile"));

    }


public static void executeCommandForScript(List<String> command) {
        // 使用ProcessBuilder执行命令
        try {
            log.info("---------->>>>command:{}", StringUtils.join(command, " "));
            ProcessBuilder pb = new ProcessBuilder(command);
            Process process = pb.start();
            // 获取并打印命令的输出
            //Thread stdoutThread = readStream(process.getInputStream(), "OUTPUT");
            //Thread stderrThread = readStream(process.getErrorStream(), "ERROR");
            //stdoutThread.start();
            //stderrThread.start();
            // 等待命令执行完成
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                log.info("Video conversion completed successfully.");
            } else {
                log.error("Video conversion failed with exit code: " + exitCode);
            }
            // 确保读取线程完成
            //stdoutThread.join();
            //stderrThread.join();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

6、HTML验证

比如使用了 4.1和4.2 的脚本进行切片处理后,如何使用

可以来一个简单的 nginx配置,

    # 视频调试
    location  / {
        root  /home/minio/data/xxx/video_test;
   
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        error_page 405 =200 @405;
      }

编写一个简单的index.html 文件

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Access-Control-Allow-Origin" content="*">
    <title>H5播放m3u8文件</title>
    <!-- <script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script> -->
    <script src="hls.min.js"></script>

<style>
  .centered-video-container {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh; /* Full height of the viewport */
  }
  video {
    max-width: 100%; /* To prevent the video from overflowing the container */
  }
</style>
</head>
<body>
<div class="centered-video-container">
  <video id="video"  controls>
  Your browser does not support the video tag.
  </video>
</div>
</body>
<script>
  var m3u8FilePath = "20240627151016AA001.m3u8";

  if (Hls.isSupported()) {
    var video = document.getElementById('video');
   // video.play();
    var hls = new Hls();
    hls.loadSource(m3u8FilePath);

    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED, function() {
      video.play();
    });
  } else if (video.canPlayType('application/vnd.apple.mpegURL')) {
    video.src = m3u8FilePath;
    video.addEventListener('loadedmetadata', function() {
      video.play();
    });
  }
</script>
</html>

小结:

使用 ffmpeg 做为视频切片工具,非常方便,有很多点值得探索,本文主要分享了, ffmpeg如果下载 ,安装,使用。并编写通用可执行shell 脚本,方便程序语言 在对用户上传的视频文件进行切片调用。

其中 m3u8 文件,记录了一个播放文件的顺序列表。方便在网络低带宽的情况下,依然可以满足用户观看视频的需求。

其他文章

ffmpeg命令中文手册-腾讯云开发者社区-腾讯云

ffmpeg命令中文手册-腾讯云开发者社区-腾讯云


网站公告

今日签到

点亮在社区的每一天
去签到