python操作ffmpeg,做视频转码【上篇】

本文详述如何利用Python结合ffmpeg将mp4视频转换为m3u8格式,包括ffmpeg的安装、基本命令、视频处理(如降低码率、调整分辨率、截取图像)以及具体的m3u8转换步骤,适合视频流处理初学者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博客要落地的场景是使用 python + ffmpeg 实现将 mp4 文件转换为 m3u8 格式视频。

为了更好的结合二者,我们先学习一下 ffmpeg 如何使用。

ffmpeg

打开其下载页面进行下载,下载按钮选择 windows builds from gyan.dev ,在新打开的页面中,在参考下述链接。

python操作ffmpeg,做视频转码【上篇】

python操作ffmpeg,做视频转码【上篇】

解压下载文件,将 bin 目录配置到环境变量中,例如橡皮擦本地的地址为:

F:\ffmpeg_full\bin

然后在控制台中运行如下命令,查看是否配置成功。

C:\Users\Administrator>ffmpeg -version
ffmpeg version 2022-01-03-git-68d0a7e446-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers

运用 ffmpeg

先看一下 ffmpeg 相关参数信息:

ffmpeg 1 2 -i 3 4 5
  1. 全局参数;
  2. 输入文件参数;
  3. 输入文件;
  4. 输出文件参数;
  5. 输出文件。

常用命令行参数,这些内容还是参考雷神的文档最佳。

最简单的转换

ffmpeg -i input.avi output.mp4

python操作ffmpeg,做视频转码【上篇】

如果解析过程中出现如下BUG,一般情况下是视频本身的问题。

[h264 @ 0x58c8900] Error splitting the input into NAL units.

截取视频的前5s(通过代码逻辑,也可以截取视频前10%)

ffmpeg -ss 00:00:15 -t 00:00:05 -i 输入视频.mp4 -vcodec copy -acodec copy 输出视频.mp4
  • -ss:开始切割时间;
  • -t:结束切割时间;
  • -vcodec copy:强制使用 codec 编解码方式,如果用copy表示原始编解码数据必须被拷贝(转雷神描述),可以简写为 -c:v copy
  • -acodec copy:同上,可以简写为 -c:a copy

如果单纯的想要查看视频信息,使用如下命令即可

ffmpeg -i 输入视频.mp4

python操作ffmpeg,做视频转码【上篇】

视频文件直接属性可查看相关参数。

  • 数据速率就是视频码率;
  • 总比特率是视频码率加上音频码率;

python操作ffmpeg,做视频转码【上篇】

降低码率

使用如下命令可以降低码率,间接的降低文件大小。

ffmpeg -i 输入文件.mp4 -b:v 500k -bufsize 500k 输出文件.mp4

码率的计算参考下述公式

bitrate(码率) = file_size(文件大小) / duration(时长),单位是 `kb/s`

例如一个 100M的文件,时长为10分钟,那么码率是

biterate = 100Mbit/600s = 100*1024*1024*8bit/600s ≈ 1390kbps

音频的码率一般是 128kbps ,上述值包含音频的码率,减去 128 之后就是视频的总码率了

上述命令中参数相关含义是:

  • -b:v:控制平均码率;
  • -bufsize:用于设置码率控制缓冲器的大小,减少波动。

修改视频分辨率
将输入的 1920x1080 缩小到 960x540 输出

ffmpeg -i 输入视频.mp4 -vf scale=960:540 输出视频.mp4

如果 540 不写,写成 -1 ,即 scale=960:-1 ,ffmpeg会保持原始的宽高比。

截取视频图像

ffmpeg -i 输入视频.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
  • -r:每间隔几秒抓取一帧;
  • -q:v:存储jpeg的图像质量,2是高质量

也可以依据时间进行截取

ffmpeg -i  输入视频.mp4 -ss 00:00:00 -t 1 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
  • -ss:开始时间
  • -t :共要多少时间

上述命令表示从视频起点,间隔1秒,获取一帧作为图片。

还可以使用如下命令进行截取

ffmpeg -i 输入视频.mp4 -y -f image2 -t 0.001 -s 960x540 a.jpg

还可以用关键帧去获取

ffmpeg -i 输入视频.mp4 -y -f image2 -frames 1 a.jpg
ffmpeg -i 输入视频.mp4 -vf "scale=iw/2:ih/2" b.png

ffmpeg 转换 mp4 为 m3u8 文件

ffmpeg -i 输入视频 -profile:v baseline -level 3.0 -start_number 0 -hls_time 60 -hls_list_size 10 -f hls demo1.m3u8
  • -start_number number:设置播放列表中最先播放的索引号,默认 0;
  • -hls_time seconds:设置段长度,单位秒,默认为2;
  • -hls_list_size size:设置播放列表中字段最大数。如果为0,则包含所有分段,默认为5;
  • -profile:v baseline -level 3.0:H.264画质级别控制,本部分知识可以另行学习;

由于上述命令转码之后,生成的文件名如下所示,所以需要修改视频切片的名称生成规则,新增如下参数 -hls_segment_filename video%07d.ts

python操作ffmpeg,做视频转码【上篇】

完整命令如下所示:

ffmpeg -i 输入视频 -profile:v baseline -level 3.0 -start_number 0 -hls_time 60 -hls_segment_filename video%07d.ts -f hls demo1.m3u8 

最终转换成高清与标清的 m3u8 命令如下:

ffmpeg -i 输入视频.mp4 -codec:a aac -async 2 -ar 44100 -codec:v libx264 -hls_time 20 -hls_list_size 0 -threads 2 -max_muxing_queue_size 9999 -y demo.m3u8

其中重要的参数有:

  • -threads 0 自动选择最大线程数;
  • -max_muxing_queue_size 1024:缓存大小;
  • -ar freq: 设置音频采样率。

转码成标清

ffmpeg -i 输入视频.mp4 -codec:v libx264 -b:v 256k -maxrate 256k -bufsize 256k -bt 512k -hls_time 20 -hls_list_size 0 -threads 2 -max_muxing_queue_size 9999 -y demo2.m3u8

记录时间

今天是持续写作的第 282 / 365 天。
可以关注我,点赞我、评论我、收藏我啦。

更多精彩


python操作ffmpeg,做视频转码【上篇】

👇👇👇扫码加入【78技术人】~ Python 事业部👇👇👇
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值