ffmpeg视频转码

发布时间 2023-04-16 23:56:13作者: 温小皮

h264和avc1差别

h264和avc1差别很小,都属于mp4的编码格式,有时甚至是通用的。区别仅在于:

  • MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略。笔者也是在改编LIVE555流媒体时,增加mp4文件类型支持时遇到了该问题。
  1. 首先,从原理上了解一下这2种格式的区别:
    AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的。
    H264 描述:H.264 bitstream with start codes.一般对于一下HDVD等电影的压制格式,是带有起始码0×00000001的。
  2. 其次,通过VLC播放器,可以查看到具体的格式。打开视频后,通过菜单【工具】/【编解码信息】可以查看到【编解码器】具体格式,举例如下,编解码器信息:
    编码: H264 – MPEG-4 AVC (part 10) (avc1)
    编码: H264 – MPEG-4 AVC (part 10) (h264)

.MP4和.mp4

  • 后缀为.MP4和.mp4是不同的。虽然它们表示相同的文件类型,但操作系统在处理文件时通常将它们视为不同的文件类型。因此,当你在文件系统中使用这些文件时,大小写是有区别的。

  • 在某些操作系统中,如Windows,文件扩展名是不区分大小写的。在这种情况下,.MP4和.mp4被视为相同的文件类型。但是,在其他操作系统中,如Linux和MacOS,文件扩展名是区分大小写的,因此.MP4和.mp4被视为不同的文件类型。

h264转avc1(相当于MP4转MP4)

import ffmpeg

pathVdMp4 = "   "
pathVdMp4_temp = "   "
(
  ffmpeg
  .input(pathVdMp4) # 读取输入文件
  .filter('fps', fps=25, round='up') # 设置输出视频的帧率为25fps
  .filter('scale', force_original_aspect_ratio='decrease', width=-2, height=-2) # 确保输出视频的分辨率与输入视频相同
  .output(pathVdMp4_temp, vcodec='libx264', pix_fmt='yuv420p') # 设置输出视频编码和像素格式
  .overwrite_output()
  .run()
)
  • vcodec='libx264'表示使用 libx264 编码器
  • fps=25转码后帧率为25帧/s
  • force_original_aspect_ratio='decrease', width=-2, height=-2 保持横纵分辨率不变。参数force_original_aspect_ratio='decrease'告诉过滤器要缩小原始比例,而width=-2和height=-2告诉过滤器保持视频的宽高比,并将宽度和高度调整为与输入视频相同的分辨率。通过此方法进行缩放后,输出视频的尺寸始终与输入视频相同。
  • pix_fmt='yuv420p'表示输出像素格式为 yuv420p
在这个例子中,我们使用ffmpeg库来读取输入视频文件,并使用filter方法来应用FFmpeg过滤器。
我们首先使用fps过滤器将输出视频的帧率设置为25 fps,并使用scale过滤器确保输出视频的分辨率与输入视频的分辨率相同。
最后,我们使用output方法将转换后的视频写入输出文件,并使用overwrite_output方法告诉FFmpeg在目标文件已存在时覆盖它。

输出像素格式

  • 输出像素格式指的是输出视频文件中每一个像素的编码格式。不同的像素格式会对视频的画质和文件大小产生影响。常见的像素格式包括YUV、RGB、RGBA等,其中YUV通常用于视频编码,RGB和RGBA则用于静态图像编码。在上述代码中,使用了像素格式为yuv420p,这是一种常用的视频压缩技术,可以在保证画质的同时减小文件大小。