首页 > 解决方案 > ffmpeg 原始视频和音频标准输入

问题描述

目前,我正在使用 ffmpeg 从原始格式的帧开始生成在 OBS 中广播的视频输出。

问题是我们想给它添加一个音轨,也就是说:每一帧现在都有它的像素矩阵和它的音频。

我不确切知道如何让 ffmpeg 采用这种复合信号或最好的方法是什么。实际上我使用的是ffmpeg的标准输入。我使用此代码生成它:

url = "udp://" + udp_address + ":" + str(udp_port)
command = [
        'ffmpeg',
         '-loglevel',
         'error',
         '-re',
         '-y',
         
         # Input
         '-i', '-',
         '-f', 'rawvideo',
         '-vcodec', 'rawvideo',
         '-pix_fmt', 'bgr24',
         '-s', str(size[0]) + 'x' + str(size[1]),
         
         # Output
         '-b:v', '16M',
         '-maxrate', '16M',
         '-bufsize', '16M',
         '-pix_fmt', 'bgr24',
         '-f', 'mpegts', url
 ]

proc = subprocess.Popen(command, stdin=subprocess.PIPE)
proc.stdin.write(frame.tobytes())

将音频添加到每个帧的最佳方法是什么?谢谢

标签: pythonaudiovideoffmpeg

解决方案


使用命名管道(FIFO)。Linux/macOS 的简化示例:

  1. 制作命名管道:

    mkfifo video
    mkfifo audio
    
  2. 输出/管道视频和音频到标准输出。这ffmpeg用于为命名管道生成视频和音频,仅用于演示目的。

    ffmpeg -y -re -f lavfi -i testsrc2=s=1280x720:r=25 -f rawvideo video & ffmpeg -y -re -f lavfi -i sine=r=44100 -f s16le audio
    
  3. 使用命名管道作为输入ffmpeg

    ffmpeg -f rawvideo -video_size 320x240 -pixel_format yuv420p -framerate 25 -i video -f s16le -sample_rate 44100 -channels 1 -i audio -t 10 output.mp4
    

推荐阅读