ffmpeg 怎么处理 h265 切 h264 的直播流? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JusticeLanding
V2EX    FFmpeg

ffmpeg 怎么处理 h265 切 h264 的直播流?

  •  
  •   JusticeLanding 2022-05-26 12:23:03 +08:00 3200 次点击
    这是一个创建于 1323 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟在用 ffmpeg 做一个直播流的播放器,发现当直播流中 265 切成 264 ,播放器会卡死,查了下是 ffmpeg 的 265 封装器没法直接解析 264 的封装头部,于是找到解析报错的地方是在 ff_h2645_packet_split 里的 hevc_parse_nal_header 。 本以为把这个 ret 为负的报错抛上去就能解决了。 结果改完后,发现个别手机的正常 265 直播流也会 ret<0 ,这下不知道该怎么区分是编码格式切换引起还是个简单的 warning 了。 有大神能给点思路吗?

    int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int is_nalff, int nal_length_size, enum AVCodecID codec_id) { ...... if (codec_id == AV_CODEC_ID_HEVC) ret = hevc_parse_nal_header(nal, logctx); else ret = h264_parse_nal_header(nal, logctx); if (ret <= 0 || nal->size <= 0) { if (ret < 0) { av_log(logctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n", nal->type); } pkt->nb_nals--; } ...... } 
    12 条回复    2022-05-26 19:59:15 +08:00
    iamzuoxinyu
        1
    iamzuoxinyu  
       2022-05-26 12:30:36 +08:00
    h265 又不向下兼容 h264 吧。切编码的时候不是能拿到 sps 还是 pps 来着?犯不着改 ffmpeg 代码吧。
    JusticeLanding
        2
    JusticeLanding  
    OP
       2022-05-26 12:41:57 +08:00 via iPhone
    @iamzuoxinyu 流是 ffmpeg 收的,ffmpeg 里面都还没把一段段 ts 拼凑成一帧递给上层,还没到 sps pps 的阶段。上面这个函数就是在尝试从 buffer 里面组装出一帧。sps pps 也是帧的一种吧,数据还在 buffer 里
    iamzuoxinyu
        3
    iamzuoxinyu  
       2022-05-26 16:24:39 +08:00
    @JusticeLanding 我应该是理解错了。是说 ffmpeg 拉流时源切换了编码,然后 ffmpeg 报 warning ?是直接用的 ffmpeg 命令行还是用了 libav 的库?不太清楚你的流程。
    Huelse
        4
    Huelse  
       2022-05-26 16:47:06 +08:00
    思路不对吧?应该分开处理的

    之前做网页播放器用了 hls.js ,m3u8 切换起来还是很方便的
    toss156
        5
    toss156  
       2022-05-26 16:56:56 +08:00
    一般来说 h264 和 h265 ,拉的不同的流,切换应该重置解码器,重新开始解析。 还是说你想要实现无缝切换?
    marchel3255
        6
    marchel3255  
       2022-05-26 16:59:36 +08:00
    没办法无缝的吧, 切流需要重制编码器的
    iamzuoxinyu
        7
    iamzuoxinyu  
       2022-05-26 17:01:27 +08:00
    @marchel3255 无缝切换倒也可以,就是缓冲几帧嘛,牺牲一下 latency 。
    ysc3839
        8
    ysc3839  
       2022-05-26 17:55:46 +08:00
    @toss156 楼主可能是想复用连接,发现数据变了就换一个解码器。个人觉得这种需求可能用 gstreamer 更好搞。
    Latin
        9
    Latin  
       2022-05-26 18:22:37 +08:00
    ffprobe 先看下?
    JusticeLanding
        10
    JusticeLanding  
    OP
       2022-05-26 18:39:10 +08:00 via iPhone
    @iamzuoxinyu
    @Huelse
    用的 libav ,我这直播是只有一个 ts 链接,ffmpeg 只打开了一次。m3u8 里有多个 ts 链接,重新 open 是可以无缝切换的。
    @toss156
    @marchel3255
    @iamzuoxinyu
    @ysc3839
    没有想要无缝切换,想要识别到编码切换了,上报错误让播放器停止播放,让用户重新点播。
    iamzuoxinyu
        11
    iamzuoxinyu  
       2022-05-26 19:06:44 +08:00
    @JusticeLanding 是怎么推流的?切换编码时不会产生 EOF 么?
    haah
        12
    haah  
       2022-05-26 19:59:15 +08:00
    两种编码完全不一样,好奇你咋切?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5266 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 05:46 PVG 13:46 LAX 21:46 JFK 00:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86