丢弃数据包而不引起DTS错误

问题描述

我有2个ffmpeg实例正在通过用C写的缓冲区。

ffmpeg实例之一是创建FLV输出并将其发送到TCP套接字,该套接字已连接到C程序。 C正在填充数组,然后将数据包发送到另一个ffmpeg实例。

要点是,第一个ffmpeg实例可以断开连接,并且可以重新启动。

一个ffmpeg实例看起来像这样:

ffmpeg \
    -re \
    -fflags +igndts \
    -fflags flush_packets \
    -fflags discardcorrupt \
    -r 25 \ \
    -i $INPUT_VIDEO_STREAM \
    -safe 0 \
    -i music.txt \
    -fflags +genpts \
    -c:a mp3 \
    -b:a 320k \
    -c:v copy \
    -frame_drop_threshold 1.0
    -preset ultrafast \
    -f flv  rtmp://live.twitch.tv/app/live_KEY \
    -async 1 \
    -vsync 2

问题是,如果我停止另一个ffmpeg实例并重新启动它,则会收到“数据包丢失”错误,然后,我将在输出错误中收到一堆非单调DTS错误

[flv @ 0x55acf23632a0]数据包不匹配-1135911011 34757 9695626ate = 1560.2kbits / s速度= 1x

... [flv @ 0x55acf23d0ec0]输出流0:0中的单调DTS;前一个:62560,当前:19080;更改为62560。这可能会导致输出文件中的时间戳不正确。 [flv @ 0x55acf23d0ec0]输出流0:0中的单调DTS;前一个:62560,当前:19120;更改为62560。这可能会导致输出文件中的时间戳不正确。 [flv @ 0x55acf23d0ec0]输出流0:0中的单调DTS;前一个:62560,当前:19160;更改为62560。这可能会导致输出文件中的时间戳不正确。 [flv @ 0x55acf23d0ec0]输出流0:0中的单调DTS;前一个:62560,当前:19200;更改为62560。这可能会导致输出文件中的时间戳不正确。 [flv @ 0x55acf23d0ec0]输出流0:0中的单调DTS;前一个:62560,当前:19240;更改为62560。这可能会导致输出文件中的时间戳不正确。 [flv @ 0x55acf23d0ec0]输出流0:0中的单调DTS;前一个:62560,当前:19280;更改为62560。这可能会导致输出文件中的时间戳不正确。 [flv @ 0x55acf23d0ec0]输出流0:0中的单调DTS;前一个:62560,当前:19320;更改为62560。这可能会导致输出文件中的时间戳不正确。 ...

我想发生的是继续播放mp3并放下不良的视频包,可以剪切视频片段,然后开始播放新的片段。如果视频在几秒钟内表现出奇怪的状态,即使那样也没关系,但是流必须是连续的。

我已经尝试过的事情:

  • 几个异步/垂直同步选项(垂直同步1,垂直同步2,垂直同步下降)
  • “-fflags + igndts”,删除此选项,将其添加输出
  • -fflags + genpts
  • 将探针大小设置为32
  • fflags丢弃损坏

我也开始写一个setpts过滤器,但是找不到语法

我如何以流媒体时间戳不连续的方式流mp3列表,有时会发生丢包?

解决方法

似乎是“ -c:v复制”引起了问题。 我将-c:v copy更改为-c:v libx264,现在可以正常使用了。

我还在音频输入之前添加了-re