V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jaleo
V2EX  ›  问与答

请教 ffmpeg 组合视频和音频流

  •  
  •   jaleo · 2023-03-21 19:44:39 +08:00 · 1026 次点击
    这是一个创建于 647 天前的主题,其中的信息可能已经有所发展或是发生改变。
    两个视频流,rtmp://stream-1(1080P 无声) 和 rtmp://stream-2(480P 有音频)
    想把 stream-1 的视频和 stream-2 的音频组合成新的流输出
    我自己尝试:
    ffmpeg -i "rtmp://stream-1" -i "rtmp://stream-2" -c:v copy -c:a copy -f flv "rtmp://stream-3"
    这样的命令似乎是用了第一个视频和第二个音频,能输出 stream-3 流,但是运行时有错误提示 missing picture in access unit with size xx ,不知道什么原因,所以请教下正确的命令格式。
    7 条回复    2023-03-21 21:47:23 +08:00
    nodejx
        1
    nodejx  
       2023-03-21 20:27:48 +08:00
    Testing GPT 4:


    根据你提供的信息,我认为你需要使用 FFmpeg 的 filter_complex 选项来将两个流合并。以下是一个示例命令,你可以根据需要进行修改:


    ffmpeg -i rtmp://stream-1 -i rtmp://stream-2 -filter_complex "[0:v]scale=1920x1080,setsar=1[v0];[1:a]aresample=44100[a1];[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a0];[v0][a0][a1]concat=n=1:v=1:a=1" -f flv rtmp://stream-3

    这个命令将第一个流的视频缩放到 1080p 并设置像素宽高比,将第一个流的音频格式转换为 FLTP ,将第二个流的音频重新采样为 44100Hz ,然后将所有流连接在一起。最后,将输出流编码为 FLV 格式并将其发送到 rtmp://stream-3 。

    希望这可以帮助到你!
    zbinlin
        2
    zbinlin  
       2023-03-21 21:12:28 +08:00
    ffmpeg -i "rtmp://stream-1" -c:v copy -i "rtmp://stream-2" -c:a copy -f flv "rtmp://stream-3"

    应该是这样吧?
    jaleo
        3
    jaleo  
    OP
       2023-03-21 21:25:46 +08:00
    @zbinlin 试了会报错 Unknown decoder "copy"
    @nodejx 按照示例没成功 也是报错

    网上说 missing picture in access unit with size 错误是 bug 据说已经修复 为什么我这儿还是会报错
    orangie
        4
    orangie  
       2023-03-21 21:31:59 +08:00   ❤️ 1
    从不同文件中合并音轨、视频流信道。下面的命令将第一个输入文件(-map 0:v:0 中的第一个 0 )的视频流(中间的 v )的第一个流(后一个 0 ),以及第二个输入文件的音频流(中间的 a )取出,放到输出文件中。

    ffmpeg -i input-1.avi -i input-2.avi -map 0:v:0 -map 1:a:0 output.mp4
    如果希望不改变编码方式,仅仅提取和更换视频、音频流,那么可以尝试指定编码方式为 copy ,即直接复制数据,不转换编码,这样会非常快,几乎相当于复制文件的速度。

    ffmpeg -i input-1.mp4 -i input-2.mp4 -c copy -map 0:v:0 -map 1:a:0 output.mp4
    chutsetien
        5
    chutsetien  
       2023-03-21 21:36:49 +08:00   ❤️ 1
    -c:a copy 和 -c:v copy 可以合为 -c copy, 但如果不能正确识别轨道的话可以人工指定 -map 0:v:0 -map 1:a:0 (既采用第一个输入源的第一个视讯轨和采用第二个输入源的第一个音讯轨).
    kokutou
        6
    kokutou  
       2023-03-21 21:46:28 +08:00
    先试试
    ffmpeg -i "rtmp://stream-x" -c copy 1.mp4
    能不能出来吧...
    imaning
        7
    imaning  
       2023-03-21 21:47:23 +08:00   ❤️ 1
    ffmpeg -re -i rtmp://127.0.0.1/live/Stream1 -re -i rtmp://127.0.0.1/live/Stream2 -map 0:v:0 -map 1:a:0 -c copy -bsf:a aac_adtstoasc -async 1 -f flv rtmp://127.0.0.1/live/Stream3

    测试了下,转成功了的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2845 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:53 · PVG 16:53 · LAX 00:53 · JFK 03:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.