当前位置: 首页 > 知识库问答 >
问题:

关于视频文件和媒体流中PTS的困惑

孙言
2023-03-14

文件中特定帧的PTS是否可能与流式传输时同一文件中同一帧的PTS不同?

当我使用av_read_frame读取帧时,我将视频流存储在avstream中。在使用avcodec_decode_video2解码帧后,使用av_frame_get_best_effort_timestamp将该帧的时间戳存储在int64_t中。现在,如果程序从一个文件中获取其输入,我会得到一个不同的时间戳,与我将输入(从同一个文件)流到程序时不同。

要更改输入类型,只需将argv参数从“/path/To/file.mp4”更改为“udp://localhost:1234”,然后在命令行中使用ffmpeg将文件流式传输:“ffmpeg-re-i/path/To/file.mp4-f mpegts udp://localhost:1234”。会不会是因为“-f mpegts”参数改变了媒体的某些特性?

下面是我的代码(简化)。通过阅读ffmpeg邮件列表档案,我意识到我要查找的time_base在AVStream中,而不是avcodeccontext中。我也尝试使用packet.pts,而不是使用av_frame_get_best_effort_timestamp,但是结果没有改变。我需要时间戳有一个帧数的概念在一个流式视频正在接收。我真的很感激任何形式的帮助。

//..
//argv[1]="/file.mp4";
argv[1]="udp://localhost:7777";
// define AVFormatContext, AVFrame, etc.
// register av, avcodec, avformat_network_init(), etc.
avformat_open_input(&pFormatCtx, argv, NULL, NULL);
avformat_find_stream_info(pFormatCtx, NULL);
// find the video stream...
// pointer to the codec context...
// open codec...
pFrame=av_frame_alloc();
while(av_read_frame(pFormatCtx, &packet)>=0) {
        AVStream *strem = pFormatCtx->streams[videoStream];
        if(packet.stream_index==videoStream) {
            avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
            if(frameFinished) {
                int64_t perts = av_frame_get_best_effort_timestamp(pFrame);
                if (isMyFrame(pFrame)){
                     cout << perts*av_q2d(strem->time_base) << "\n";
                }
             }
}
//free allocated space
}
//..

共有1个答案

谈渊
2023-03-14

时间戳存储在容器级别,因此更改容器可以更改时间戳。此外,TS为每一帧存储一个时间戳(基于90kHz时钟)。MP4只存储假设开始时间为0的帧持续时间(对于bframes来说,这变得更加复杂,因为第一个PTS为零,第一个DTS为<0)。因此,为了得到时间戳,所有的帧持续时间都被添加。Mp4还允许设置时钟速率。它通常是每秒1001/3000滴答,29.97fps,但它可以设置为任何东西。所以av_frame_get_best_effort_timestamp返回codec->stream_base单位的滴答数。对于TS编解码器->stream_base总是1/90000

 类似资料:
  • 我正在使用Twilio视频API,只想要音频通话。我通过了下面的约束,但是,网络摄像头仍然出现在被邀请的人身上。似乎约束只对创建对话的人有效。 是否可以强制对话下的所有客户端默认禁用视频? 另外,当只有音频被激活时,浏览器是否可能只要求麦克风来获得权限?它问麦克风和摄像头是否只是一个音频通话,这很奇怪。 来源:https://media.twiliocdn.com/sdk/js/conversat

  • 我正在尝试从google drive流式传输视频,但不起作用 这是我的密码 我在这里启动函数图像时得到这个

  • 实际上,我的目标是实现一个webview,并在webview中捕获流视频的url。我尝试了这么多代码,但没有结果。这是我迄今为止尝试过的代码`

  • 当从avi转码到mp4(x264)时,我遇到了fps问题。最终问题出在PTS和DTS值上,所以在AV_INTLEAVED_WRITE_FRAME函数之前添加的第12-15行: 看了很多帖子我还是不明白: =1/25和=1/12800。第一个是我设置的,但我不知道为什么和谁设置了12800?我注意到,在第(7)行=1/90000之前,紧接着它变成了1/12800,为什么?当我从avi转码到avi时,

  • 我正在从两个不同的线程接收视频H264编码数据和音频G.711 PCM编码数据,以mux/写入多媒体容器。 writer函数签名如下所示: 提前感谢! 编辑:在我的视频流中,没有B帧。所以,我认为这里PTS和DTS可以保持不变。

  • 多媒体 HTML5 前的多媒体需要借助第三方插件,例如 Flash,但是 HTML5 将网页中的多媒体带入了新的一章。 基本用法 // 音频 // 指定资源类型可以帮助浏览器更快的定位解码 <audio autobuffer autoloop loop controls> <source src="/media/audio.mp3" type="audio/mpeg"> <source s