- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在从两个不同的线程接收视频 H264 编码数据和音频 G.711 PCM 编码数据以复用/写入 mov
多媒体容器。
writer 函数签名如下:
bool WriteAudio(const unsigned char *pEncodedData, size_t iLength);
bool WriteVideo(const unsigned char *pEncodedData, size_t iLength, bool const bIFrame);
添加音频和视频流的函数如下所示:
AVStream* AudioVideoRecorder::AddMediaStream(enum AVCodecID codecID) {
Log("Adding stream: %s.", avcodec_get_name(codecID));
AVCodecContext* pCodecCtx;
AVStream* pStream;
/* find the encoder */
AVCodec* codec = avcodec_find_encoder(codecID);
if (!codec) {
LogErr("Could not find encoder for %s", avcodec_get_name(codecID));
return NULL;
}
pStream = avformat_new_stream(m_pFormatCtx, codec);
if (!pStream) {
LogErr("Could not allocate stream.");
return NULL;
}
pStream->id = m_pFormatCtx->nb_streams - 1;
pStream->time_base = (AVRational){1, VIDEO_FRAME_RATE};
pCodecCtx = pStream->codec;
switch(codec->type) {
case AVMEDIA_TYPE_VIDEO:
pCodecCtx->codec_id = codecID;
pCodecCtx->bit_rate = VIDEO_BIT_RATE;
pCodecCtx->width = PICTURE_WIDTH;
pCodecCtx->height = PICTURE_HEIGHT;
pCodecCtx->gop_size = VIDEO_FRAME_RATE;
pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
m_pVideoStream = pStream;
break;
case AVMEDIA_TYPE_AUDIO:
pCodecCtx->codec_id = codecID;
pCodecCtx->sample_fmt = AV_SAMPLE_FMT_S16;
pCodecCtx->bit_rate = 64000;
pCodecCtx->sample_rate = 8000;
pCodecCtx->channels = 1;
m_pAudioStream = pStream;
break;
default:
break;
}
/* Some formats want stream headers to be separate. */
if (m_pOutputFmt->flags & AVFMT_GLOBALHEADER)
m_pFormatCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;
return pStream;
}
在 WriteAudio(..)
和 WriteVideo(..)
函数中,我正在使用 av_init_packet(.. .)
并将pEncodedData
和iLength
设置为packet.data
和packet.size
。我打印了 packet.pts
和 packet.dts
及其等效于 AV_NOPTS_VALUE
。
现在,我如何计算 PTS、DTS 和数据包持续时间(packet.dts
、packet.pts
和 packet.duration
) 正确处理音频和视频数据,以便我可以同步音频和视频并正确播放?我在互联网上看到了很多例子,但对我来说没有一个有意义。我是 ffmpeg
的新手,在某些情况下我的概念可能不正确。我想以适当的方式去做。
提前致谢!
编辑:在我的视频流中,没有 B 帧。所以,我觉得PTS和DTS在这里可以保持一致。
最佳答案
PTS/DTS是时间戳,应该设置为输入数据的时间戳。我不知道你的日期来自哪里,但任何输入都有某种形式的时间戳与之相关联。通常,输入媒体文件的时间戳或系统时钟派生的指标(如果您是从声卡+网络摄像头录制的)等等。您应该将这些数字转换成预期的形式,然后将它们分配给AVPacket.pts/dts
。
关于c++ - 视频和音频帧的 PTS 和 DTS 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31917032/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在寻找一种方法来检测带有图像点的消息 SCTE35 点。你有什么建议吗? 谢谢你的帮助 最佳答案 到目前为止我已经成功使用了DVBInspector对于这个问题。 关于ffmpeg - 如何使用
当从具有视频和音频流的媒体文件中提取片段而不重新编码(-c 复制)时,指定的请求查找和结束时间很可能不会精确地落在源中的关键帧上。 在这种情况下,ffmpeg 将抓取每个轨道最近的关键帧,并使用不同的
我的应用程序需要在输入的两个(或多个)流之间切换,而只有一个输出(您可以将其视为流多路复用器)。来自输入的帧被解码,然后由于覆盖的东西再次重新编码。 因此,为了安排 AVFrame PTS,我在编码帧
我有一个带有视频和元数据流的 TS。视频已正确设置 PTS 值,而元数据没有(ffprobe 为每个提供 N/A)。但是,元数据包在流中的位置正确。 有没有一种方法可以根据元数据包在流中的位置为它们分
有人可以简要解释一下首字母缩略词 PTS 在视频编码方面的含义吗? 最佳答案 演示文稿时间戳。我不能说它比维基页面更好,在这里找到:http://en.wikipedia.org/wiki/Prese
我正在尝试在输入流上重置 pts 并创建新的 pts 并将流发布到 RTMP。 ffmpeg -re -f lavfi -i "movie=${SOURCE}:s=0+1[out0][out1];[0
假设我有一个来自现有 HLS 的 .ts 文件,我只是想调整它的大小。例如,创建第二个较低分辨率的流,可以在带宽不足时切换。 ffmpeg -i video1080_1.ts -vf "scale=1
我有一个视频,其中包含超出视频数据末尾的一些音频数据包: $> ffprobe -show_packets video.mp4 ... ... ... [PACKET] codec_type=vide
我有一个 mov我需要得到结尾的文件pts对于音频和视频流。我可以通过执行以下操作(手动)来做到这一点: ffprobe -show_packets file.mov 这给了我这样的输出(当然还有更多
我有以下文件: version: 1 n_points: 68 { 55.866278 286.258077 54.784191 315.123248 62.148364 348.908294 83
据我所知,PCR 以 42 位存储,PTS 以 33 位存储在 mpegts 容器中 所以, Max value for PCR is 2^42 = 4398046511104 Max value
我有一个IP摄像机,可以发送8000hz采样率配置的音频和H264视频。 我做了一个程序,从这个IP摄像机生成TS文件,它在VLC,除了iPhone的Android Media Player,Mac
尝试通过 ffmpeg 了解一些音频/视频同步问题,我注意到以下内容。运行此代码 while (av_read_frame(formatCtx, &packet) >= 0) { if (pac
我在从 avi 转码为 mp4(x264) 时遇到了 fps 问题。最终问题出在 PTS 和 DTS 值上,因此在 av_interleaved_write_frame 函数之前添加了第 12-15
我有一个 MPEG2 TS 文件,现在我有兴趣从每个图片帧中提取 PTS 信息。我知道 PTS 是用 33 位描述的,包括 3 个标记位。但是我不知道如何将这个位域转换为更容易理解的形式(秒,毫秒)。
我有一个使用 STDIN 3 的终端 (/proc/xxxx/fd/0 ->/dev/pts/3) 所以如果(在另一个终端)我这样做: echo 'do_something_command' > /d
我正在使用 ffprobe 测试带有 H264 视频的 mp4 文件。 我正在使用以下命令来获取帧信息。 ffprobe -i -show_frames -select_streams v 我得到以
我们有一些处理视频的 FFmpeg 信封。 视频的树首帧为:B -> B -> I 如下图: PTS 和 DTS 对第一帧返回负数: 我们有一些代码会跳过某个时间点以下的帧(第一帧为 0)。 是否可以
我一直在使用从 python 脚本调用的 ffmpeg 命令对文件文件夹进行转码: ffmpeg -y -i in_file.mov -loglevel warning -codec:v libx26
我是一名优秀的程序员,十分优秀!