首页 > 解决方案 > 如何使用实际捕获帧的时间设置 PTS 字段(使用 FFmpeg)?

问题描述

使用 FFmpeg,我想用实际捕获帧的时间来更新 PTS 字段。我正在使用以下 FFmpeg 命令(“copyts”标志完成这项工作):

ffmpeg -re -f v4l2 -copyts -i /dev/video0 -c:v libx264 -intra -f mpegts -mpegts_copyts 1 udp://192.168.10.199:1234

但是,它只能在很小的帮助下工作......我不得不编辑 v4l2.c 文件:

static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
{
   ...
   ...
   ...

   pkt->pts = buf_ts.tv_sec * INT64_C(1000000) + buf_ts.tv_usec; 

   pkt->pts &= 0x1ffffffff;  /*modified by me*/                                            
   pkt->dts = 0;             /*modified by me*/

   av_log(ctx, AV_LOG_ERROR, "pts: %lld, dts: %lld\n", pkt->pts, pkt->dts);       
   convert_timestamp(ctx, &pkt->pts);                                             

   return pkt->size;                                                                                                                                               
}

当然,我不想修改功能......

任何想法使用“copyts”标志,这样它就可以在不编辑函数 mmap_read_frame() 的情况下工作?

我正在使用最新的 FFmpeg 源。没有我的修改我得到这个:

Output #0, mpegts, to 'udp://192.168.10.55:1234':
  Metadata:
    encoder         : Lavf58.35.100
    Stream #0:0: Video: h264 (cedrus264), nv12, 1280x720, q=2-31, 200 kb/s, 10 fps, 90k tbn, 10 tbc
    Metadata:
      encoder         : Lavc58.64.101 cedrus264
frame=    1 fps=0.2 q=-0.0 Lsize=      28kB time=59652:19:24.70 bitrate=   0.0kbits/s speed=4.82e+07x    
video:27kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.599154%

标签: ffmpegv4l2mpeg2-tslibx264

解决方案


推荐阅读