如何使用ffmpeg调整mpeg 2 ts的开始时间?

如何使用ffmpeg调整mpeg 2 ts的开始时间?,ffmpeg,http-live-streaming,mpeg2-ts,ffprobe,Ffmpeg,Http Live Streaming,Mpeg2 Ts,Ffprobe,我正在编写简单的HLS(Http直播)java服务器到直播(真正的直播,不是点播)屏幕秀+语音。我不断地获取图像帧和音频样本块作为服务的输入,并生成mpeg 2 ts文件+m3u8播放列表网页作为输出。工作流程如下所示: 在一定时间段内收集(缓冲)源视频帧和音频 将一系列视频帧转换为h.264编码的视频文件 将音频样本转换为mp3音频文件 使用ffmpeg命令将它们合并到.ts文件中 ffmpeg -i audio.mp3 -i video.mp4 -f mpegts -c:a copy -c:

我正在编写简单的HLS(Http直播)java服务器到直播(真正的直播,不是点播)屏幕秀+语音。我不断地获取图像帧和音频样本块作为服务的输入,并生成mpeg 2 ts文件+m3u8播放列表网页作为输出。工作流程如下所示:

  • 在一定时间段内收集(缓冲)源视频帧和音频
  • 将一系列视频帧转换为h.264编码的视频文件
  • 将音频样本转换为mp3音频文件
  • 使用ffmpeg命令将它们合并到
    .ts
    文件中

    ffmpeg -i audio.mp3 -i video.mp4 -f mpegts -c:a copy -c:v copy -vprofile main -level:v 4.0 -vbsf h264_mp4toannexb -flags -global_header segment.ts
    
  • 在m3u8播放列表上发布多个
    .ts
    文件

  • 问题是播放第一段后播放列表中断。VLC记录以下错误:

    freetype error: Breaking unbreakable line
    ts error: libdvbpsi (PSI decoder): TS discontinuity (received 0, expected 4) for PID 17
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 0
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 4096
    core error: ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 1000 ms)
    core error: ES_OUT_RESET_PCR called
    core error: Could not convert timestamp 185529572000
    ts error: libdvbpsi (PSI decoder): TS discontinuity (received 0, expected 4) for PID 17
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 0
    ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 4096
    core error: ES_OUT_SET_(GROUP_)PCR is called too late (jitter of 8653 ms ignored)
    core error: Could not get display date for timestamp 0
    core error: Could not convert timestamp 185538017000
    core error: Could not convert timestamp 185538267000
    core error: Could not convert timestamp 185539295977
    ...
    
    我猜原因是段的开始时间不属于一个流,但一旦添加了新的块,就不可能对整个流进行合并和重新分段(使用
    ffmepg-f段
    )。尝试将
    #EXT-X-intercontinuction
    标记添加到播放列表中,但无效。当我
    ffprobe
    它们时,我得到:

    Input #0, mpegts, from '26.ts':
    Duration: 00:00:10.02, start: 1.876978, bitrate: 105 kb/s
    Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 640x640, 4 fps, 4 tbr, 90k tbn, 8 tbc
    Stream #0:1[0x101]: Audio: mp3 ([3][0][0][0] / 0x0003), 48000 Hz, mono, s16p, 64 kb/s   
    
    其中,行
    中的起始值持续时间:00:00:10.02,起始时间:1.876978,比特率:105 kb/s
    对于所有段都或多或少相等。 当我检查可用的经验证的工作播放列表(如)中的片段时,每个片段都有diffrenet开始值,例如:

    Input #0, mpegts, from 'segm150518140104572-424570.ts':
    Duration: 00:00:06.17, start: 65884.808689, bitrate: 479 kb/s
    Program 257
    Stream #0:0[0x20]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 320x180 [SAR 1:1 DAR 16:9], 30 fps, 29.97 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x21]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 115 kb/s
    Stream #0:2[0x22]: Data: timed_id3 (ID3  / 0x20334449)
    
    接下来呢

    Input #0, mpegts, from 'segm150518140104572-424571.ts':
    Duration: 00:00:06.22, start: 65890.814689, bitrate: 468 kb/s
    Program 257
    Stream #0:0[0x20]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 320x180 [SAR 1:1 DAR 16:9], 30 fps, 29.97 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x21]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 124 kb/s
    Stream #0:2[0x22]: Data: timed_id3 (ID3  / 0x20334449)
    
    不同之处在于
    segm15018140104572-424571.ts的开始时间等于
    segm15018140104572-424570.ts的开始时间+持续时间


    如何使用
    ffmpeg
    调整此起始值?或者我的整个计划都错了?不幸的是,我在互联网上找不到使用ffmepg实现的实时(非点播)视频服务的工作示例。

    它不仅是时间戳,还是连续性指标。因此,设置开始时间并不能解决问题。您必须编码为单个流。

    我已经用所描述的方法回答了我自己的问题。 可使用
    -f段的
    -initial_offset
    参数调整时间戳
    格式:

    ffmpeg -i in.ts -vcodec copy -acodec copy -f segment -initial_offset 10 -segment_format mpegts out%d.ts
    
    对于每个新段,我计算必要的初始偏移量,作为所有先前段长度的总和。

    您可以设置“-段时间20”使输出仅为一个ts文件

    fmpeg.exe -i 0.mp3 -c copy -bsf:v aac_adtstoasc -f segment -segment_time 20 -initial_offset 10 -segment_format mpegts out%d.ts
    

    你能分享你的4个ts片段吗?你可以给我发链接。我将在我的播放列表中使用它们,看看发生了什么。@Alam您的38.ts、39.ts、40.ts和41.ts段都是相同的文件。(如果缓冲区正在更新,请检查缓冲区)您是否使用2
    ffmpeg
    命令访问ts文件?另外,当我使用
    -initial\u offset 10
    尝试您的第二个命令时,现在我将开始时间设置为11.4s。你遇到同样的事情了吗?