【问题标题】:ffmpeg raw video and audio stdinffmpeg 原始视频和音频标准输入
【发布时间】:2020-12-24 23:26:38
【问题描述】:

目前,我正在使用 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())

向每一帧添加音频的最佳方法是什么? 谢谢

【问题讨论】:

标签: python audio video ffmpeg


【解决方案1】:

使用 FFMPEG,您可以有多个输入,然后使用 -map 标志来选择应该使用哪些输入流。

例如,如果您有 1 个视频和 1 个音频片段,您可以使用以下内容:

ffmpeg -i video.mp4 -i audio.mp3 -map 0:v:0 -map 1:a:0 -c:v copy -c:a copy output.mkv

Map 可用于选择不同的输入流。在这种情况下:

  • 从第一个输入,从视频流,取第一个 (0:v:0)
  • 从第二个输入,从音频流,取第一个 (1:a:0)

要了解更多信息,请参阅:https://trac.ffmpeg.org/wiki/Map

-德维塞

【讨论】:

  • 如何将其与 -cat 运算符一起用于动态帧持续时间
【解决方案2】:

使用named pipe (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
    

【讨论】:

  • 动态帧率是怎么做到的
  • @bluejayke 你的意思是可变帧率 (VFR)?取决于你想让 ffmpeg 做什么。但这与原来的问题完全不同。
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2018-09-22
  • 2019-12-28
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多