摘要:本文介绍了 FFmpeg,一个功能强大的开源多媒体处理工具,广泛应用于视频和音频文件的处理。FFmpeg 支持多种多媒体格式,能够实现视频编码/解码、格式转换、裁剪、合并、音频提取、流媒体处理等功能。本文详细阐述了 FFmpeg 的主要组件、优势、安装方法、基本命令以及如何使用图形界面工具进行操作。
FFmpeg 是一个开源的多媒体处理工具,广泛用于处理视频和音频文件。它支持几乎所有常见的多媒体格式,包括但不限于视频编码/解码、视频转换、视频裁剪、音频提取、流媒体处理等。
FFmpeg 包含以下主要组件:


在 Windows 上安装 FFmpeg 的步骤如下:

ffmpeg-release-essentials.7z)。
使用建议
C:\FFmpeg)。
C:\FFmpeg\bin 添加到系统的环境变量 Path 中。
ffmpeg -version
以下是一些常用的 FFmpeg 命令示例:
将一个视频文件从 MP4 转换为 AVI:
ffmpeg -i input.mp4 output.avi裁剪视频的前 10 秒:
ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:10 -c copy output.mp4将视频分辨率调整为 1280x720:
ffmpeg -i input.mp4 -s 1280x720 output.mp4从视频中提取音频并保存为 MP3 文件:
ffmpeg -i input.mp4 -q:a0-map a output.mp3将视频和音频文件合并:
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4将摄像头视频流推送到 RTMP 服务器:
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g50-c:a aac -b:a 128k -ac2-ar44100-f flv rtmp://live.twitch.tv/app/stream_key
项目实际案例分享:
def main():
    if not os.path.isfile(args.face):
        raise ValueError('找不到数字人原始形象--face argument must be a valid path to video/image file')
    elif args.face.split('.')[1] in ['jpg', 'png', 'jpeg']:
        full_frames = [cv2.imread(args.face)]
        fps = args.fps
    else:
        video_stream = cv2.VideoCapture(args.face)
        fps = video_stream.get(cv2.CAP_PROP_FPS)
        print('Reading video frames...')
        full_frames = []
        while 1:
            still_reading, frame = video_stream.read()
            if not still_reading:
                video_stream.release()
                break
            if args.resize_factor > 1:
                frame = cv2.resize(frame, (frame.shape[1]//args.resize_factor, frame.shape[0]//args.resize_factor))
            if args.rotate:
                frame = cv2.rotate(frame, cv2.cv2.ROTATE_90_CLOCKWISE)
            y1, y2, x1, x2 = args.crop
            if x2 == -1: x2 = frame.shape[1]
            if y2 == -1: y2 = frame.shape[0]
            frame = frame[y1:y2, x1:x2]
            full_frames.append(frame)
    print ("Number of frames available for inference: "+str(len(full_frames)))
    if not args.audio.endswith('.wav'):
        print('Extracting raw audio...')
        command = 'ffmpeg -y -i {} -strict -2 {}'.format(args.audio, '../temp/temp.wav')
        subprocess.call(command, shell=True)
        args.audio = '../temp/temp.wav'
    wav = audio.load_wav(args.audio, 16000)
    mel = audio.melspectrogram(wav)
    print(mel.shape)
    if np.isnan(mel.reshape(-1)).sum() > 0:
        raise ValueError('Mel contains nan! Using a TTS voice? Add a small epsilon noise to the wav file and try again')
    mel_chunks = []
    #TODO 与视频对应起来,每16,理论上来说,mel_idx_multiplier与mel_step_size相等,将音频分组,并获取与音频长度相等的视频帧
    mel_idx_multiplier = 80./fps 
    i = 0
    while 1:
        start_idx = int(i * mel_idx_multiplier)
        if start_idx + mel_step_size > len(mel[0]):
            mel_chunks.append(mel[:, len(mel[0]) - mel_step_size:])
            break
        mel_chunks.append(mel[:, start_idx : start_idx + mel_step_size])
        i += 1
    print("Length of mel chunks: {}".format(len(mel_chunks)))使用 ffprobe 查看文件的详细信息:
ffprobe input.mp4如果你不熟悉命令行操作,可以使用以下图形界面工具:
FFmpeg 是一个功能强大的多媒体处理工具,适用于各种视频和音频处理任务。通过命令行操作,你可以轻松实现视频格式转换、裁剪、合并、音频提取等功能。如果你需要更直观的操作,也可以选择使用基于 FFmpeg 的图形界面工具。
FFmpeg 的开源代码托管在 GitHub 上,你可以通过以下链接访问 FFmpeg 的开源地址:
GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git
git clone https://github.com/FFmpeg/FFmpeg.git开源地址:GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git

ffmpeg -help 命令。
'ffmpeg' 不是内部或外部命令:    Path 环境变量已正确配置。如何在Windows上安装FFMPEG:完整的指南
How to install FFmpeg on Windows: a complete guide
