pyAV的安装和简单应用

pyAV的安装:

要安装 PyAV 库,我们需要首先安装 FFmpeg 库。FFmpeg 是一个开源的音视频处理工具,它提供了多种编解码器和过滤器,能够处理各种音视频操作。在安装 PyAV 之前,我们需要先确保 FFmpeg 可用。
安装pyAV的命令很简单:如果输出ffmpeg -version有输出信息的话,就可以直接安装
在这里插入图片描述

pip install av

在这里插入图片描述
安装失败的话,可能就是因为没有安装ffmpeg的原因:
安装教程:https://blog.csdn.net/Chimengmeng/article/details/130592510,注意添加环境变量。

循环读取视频每一帧,并保存为图片

import av

path = 'test.mp4'
# 打开音频/视频文件
container = av.open(path)

video_stream = container.streams.video[0]  # 对于视频文件
audio_stream = container.streams.audio[0]  # 对于音频文件


audio_frames = []
video_frames = []
# 解码并处理视频帧
for frame in container.decode(video_stream):
    # 读取视频帧
    print(f'帧索引: {
      
      frame.index},帧宽度:{
      
      frame.width},帧高度:{
      
      frame.height},帧格式:{
      
      frame.format},时间戳: {
      
      round(frame.time,2)},Frame Time Base: {
      
      frame.time_base}')
    video_frames.append(frame)
    if frame.index == 15:
        print(f'开始保存第16帧:')
        frame.to_image().save('output.jpg')

for frame in container.decode(audio_stream):
    # 读取音频帧(通道布局:表示声音的通道配置,如立体声(stereo),单声道(mono),5.1声道等。)
    print(f'帧索引: {
      
      frame.index},帧格式:{
      
      frame.format},采样率:{
      
      frame.rate},通道格式:{
      
      frame.layout},时间戳: {
      
      frame.pts},时间基准: {
      
      frame.time_base},音频样本数目: {
      
      frame.samples}')
    audio_frames.append(frame)


# 编码帧(将视频帧和音频帧对应组合)
for audio_frame, video_frame in zip(audio_frames, video_frames):
    container.mux(audio_frame.encode(), video_frame.encode())


# 关闭容器
container.close()

解码输入流并编码输出到新流

input_container = av.open('test.mp4')
input_stream = input_container.streams.get(audio=0)[0]

output_container = av.open('live_stream.mp3', 'w')
output_stream = output_container.add_stream('mp3')

for frame in input_container.decode(input_stream):
    # frame.pts = None
    for packet in output_stream.encode(frame):
        # 将编码后的数据包,混合至输出容器中
        output_container.mux(packet)

# 对`output_stream`添加一个None,表示流的结束,该行代码用于获取和混合编码好的剩余数据包。
for packet in output_stream.encode(None):
    output_container.mux(packet)

output_container.close()

猜你喜欢

转载自blog.csdn.net/douliyoufeng/article/details/133904689
今日推荐