求助 90pts(原题放不了)

股票走势绘图程序

北京时间2024/6/2 19:51,45

对了

Background

Special for beginners, ^_^

Description

画一幅股票的走势图,大家都知道,在每一个时间单元,股票的价格可能升(Rise), 降(Fall)或者是保持不变(Constant)。股票的走势用一系列的 R , F , C 来表示,作为交易 大厅的程序员,你只需要用 '/', '\' 和 '_' 描述,将图绘制出来。

Format

Input

一行,一个仅包含 R , F , C 的序列,分别表示在这个时间单元,股票升,降和保 持不变。序列长度不超过 50。

Output

输出股票的走势图,包含一个 x 轴,一个 y 轴。

x 轴的长度比图的长度大 1,在 y 轴和图的开始处也需要一个空格。每一行结尾, 不需要任何多余的空格。也不需要任何多余的行。

同时,x 轴必须在图的下方。

Samples

输入数据 1

RCRFCRFFCCRRC

输出数据 1

见下图

Limitation

1s, 1024KiB for each test case.

不知道为什么,90分,请各位大佬斧正(码风丑见谅)。

#include<bits/stdc++.h>
using namespace std;
int main()
{
  string s;
  int i,j,len,up,un,now,b[200];
  char a[200][200];
  memset(a,'?',sizeof(a));
  cin>>s;
  len=s.size();
  s+='F';
  now=up=un=100;
  for(i=0;i<len;++i)
  {
  	if(s[i]=='R')
  	{
	  a[now][i+1]='/';
  	  ++now;
  	  b[i+1]=now;
  	  if(s[i+1]!='F')up=now>up?now:up;
	}
	else if(s[i]=='F')
  	{
  	  --now;
	  a[now][i+1]='\\';
  	  b[i+1]=now;
  	  if(i!=len-1)un=now<un?now:un;
	}
	else a[now][i+1]='_',b[i+1]=now;
  }
  for(i=up;i>=un;--i)
  {
  	cout<<"| ";
  	for(j=1;j<=len;++j)
  	if(a[i][j]!='?')cout<<a[i][j];
  	else cout<<' ';
  	cout<<'\n';
  }
  cout<<"+-";
  for(i=0;i<=len;++i)
  cout<<'-';
  return 0;
}

<think>我们正在讨论视频播中的术语。PTS是Presentation Time Stamp(显示时间戳)的缩写。 在视频播过程中,PTS用于确定视频帧或音频帧应该被呈现(显示或播)的时间点。 它是多媒体容器格式(如MP4、MKV)和流媒体协议中的关键概念。 详细解释: 1. 作用:确保视频和音频的同步播,以及控制帧的显示顺序。 2. 单位:通常以时间基(time_base)的分数形式表示,最终转换为秒。 3. 与DTS的区别:DTS(Decoding Time Stamp)是解码时间戳,表示何时解码帧。在存在B帧的情况下,DTS和PTS可能不同,因为B帧可能依赖于后面的帧,所以解码顺序和显示顺序不同。 以下是一个使用FFmpeg库(C语言)读取视频文件并打印每一帧PTS的示例代码: </think>### 视频播中的 PTS(Presentation Time Stamp) PTS(Presentation Time Stamp,显示时间戳)是视频处理中的核心概念,用于**精确控制帧的显示时机**。以下是详细解释和实现: --- #### 一、PTS 的核心作用 1. **同步控制**: - 协调视频帧、音频帧和字幕的显示时间 - 解决音画不同步问 2. **帧排序**: - 确定帧的正确显示顺序(尤其在有B帧的视频中) 3. **播控制**: - 实现精确跳转、倍速播等操作 #### 二、关键概念对比 | 概念 | 全称 | 作用 | 单位 | |------|------|------|------| | **PTS** | Presentation Time Stamp | 帧的**显示时间** | 时间基单位 | | **DTS** | Decoding Time Stamp | 帧的**解码时间** | 时间基单位 | | **Time Base** | 时间基 | 时间戳的计量单位 | 分数形式(如1/90000) | --- #### 三、PTS 处理代码示例 ##### 1. 使用 FFmpeg 提取视频帧的 PTS ```python import ffmpeg def extract_pts(input_video): probe = ffmpeg.probe(input_video) video_stream = next((s for s in probe['streams'] if s['codec_type'] == 'video'), None) time_base = eval(video_stream['time_base']) # 获取时间基(如1/90000) # 提取帧信息 cap = ffmpeg.input(input_video) out, _ = ( cap.output('pipe:', format='rawvideo', vsync=0) .run(capture_stdout=True, quiet=True) ) # 解析帧数据 frames = [] for packet in out.decode('utf-8').split('\n'): if 'pts_time' in packet: pts_time = float(packet.split('pts_time=')[1].split()[0]) frames.append({ 'pts': pts_time, 'pts_base': pts_time / time_base # 转换为时间基单位 }) return frames # 示例用法 frames = extract_pts("input.mp4") for i, frame in enumerate(frames[:5]): print(f"Frame {i+1}: PTS={frame['pts']:.6f}s, Base={frame['pts_base']}") ``` **代码解释**: 1. 使用 `ffmpeg.probe` 获取视频流的时间基 2. 通过 RAW 视频输出模式捕获帧数据 3. 解析每帧的 `pts_time`(以秒为单位的PTS) 4. 转换为时间基单位(整数形式) ##### 2. PTS 音画同步实现(Web播器) ```javascript class MediaSynchronizer { constructor(video, audio) { this.video = video; this.audio = audio; this.lastVideoPTS = 0; this.lastAudioPTS = 0; } // 更新PTS状态 update(track, pts) { if (track === 'video') { this.lastVideoPTS = pts; } else { this.lastAudioPTS = pts; } this.sync(); } // 同步逻辑 sync() { const diff = this.lastVideoPTS - this.lastAudioPTS; // 音画差距超过阈值时调整 if (Math.abs(diff) > 0.1) { if (diff > 0) { this.audio.currentTime = this.video.currentTime; } else { this.video.currentTime = this.audio.currentTime; } } } } // 使用示例 const video = document.getElementById('video'); const audio = document.getElementById('audio'); const sync = new MediaSynchronizer(video, audio); // 监听视频帧显示 video.addEventListener('timeupdate', () => { sync.update('video', video.currentTime); }); // 监听音频播 audio.addEventListener('timeupdate', () => { sync.update('audio', audio.currentTime); }); ``` --- #### 四、PTS 的高级应用 1. **倍速播实现**: ```python # 修改 PTS 实现倍速播(FFmpeg) ffmpeg.input('input.mp4').filter('setpts', '0.5*PTS').output('2x_speed.mp4') ``` 2. **B帧处理**: ```c // C 示例(FFmpeg 解码) AVFrame *frame = av_frame_alloc(); while (av_read_frame(format_ctx, &packet) >= 0) { if (packet.stream_index == video_stream_idx) { avcodec_send_packet(codec_ctx, &packet); if (avcodec_receive_frame(codec_ctx, frame) == 0) { double pts_seconds = frame->pts * av_q2d(stream->time_base); printf("Frame PTS: %.3f\n", pts_seconds); } } } ``` --- #### 五、常见问解决方案 | 问 | 因 | 解决方案 | |------|------|----------| | 音画不同步 | PTS计算错误 | 检查时间基转换,添加同步补偿 | | 跳转定位不准 | 关键帧缺失 | 使用 `-noaccurate_seek` + `-seek_timestamp` | | 倍速播卡顿 | PTS间隔不均 | 重写PTS值:`setpts=N/(FRAME_RATE*SPEED)` | ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值