我正在从两个不同的线程接收视频H264编码数据和音频G.711 PCM编码数据,以mux/写入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;
}
提前感谢!
编辑:在我的视频流中,没有B帧。所以,我认为这里PTS和DTS可以保持不变。
PTS/DTS是时间戳,应该设置为输入数据的时间戳。我不知道您的日期来自哪里,但任何输入都有某种形式的时间戳相关联。通常,输入媒体文件的时间戳或系统时钟派生的度量(如果是从声卡+Webcam,等等)。您应该将这些数字转换为所需的形式,然后将它们分配给avpacket.pts/dts
。
当从avi转码到mp4(x264)时,我遇到了fps问题。最终问题出在PTS和DTS值上,所以在AV_INTLEAVED_WRITE_FRAME函数之前添加的第12-15行: 看了很多帖子我还是不明白: =1/25和=1/12800。第一个是我设置的,但我不知道为什么和谁设置了12800?我注意到,在第(7)行=1/90000之前,紧接着它变成了1/12800,为什么?当我从avi转码到avi时,
我正在尝试mux H264编码数据和G711 PCM数据到多媒体容器。我从编码数据创建,最初视频/音频帧的PTS和DTS值等效于。所以我使用当前时间信息计算了DTS。我的密码- 我添加了这样的流- 编辑: 根据Ronald S.Bultje的建议,我所理解的是: 应该设置为现在音频和视频流现在都在同一时间基本单位中。 另外,如果我想使用视频流时基作为和音频流时基作为,正确的代码应该是什么样子? 编
非单调递增的dts是什么意思? 如何使用libavformat以相同的编解码器连接2个视频文件? 流中dts到muxer的非单调递增 我相信当我增加pts和DTS时,我有正确的逻辑。我不知道我到底错过了什么。 谢了。
在页面上添加视频、声音、动画等,可以增强用户体验。在HTML5之前,为网页添加多媒体的唯一办法,就是使用第三方的插件(如,Adobe Flash等)。 HTML5中,提供了对多媒体的原生支持,只需通过 video元素,就可以向网页嵌入视频、电影或音频资源,通过 audio元素向网页嵌入音频资源,省时省力。 视频 早就听说HTML提供了对视频的原生支持,你可能已经迫不及待想体验一下了。 在HTML5
HTML5功能包括本机音频和视频支持,无需使用Flash。 HTML5 和 标签使得向网站添加媒体变得简单。您需要设置src属性以标识媒体源并包含控件属性,以便用户可以播放和暂停媒体。 嵌入视频 以下是在您的网页中嵌入视频文件的最简单形式 - <video src = "foo.mp4" width = "300" height = "200" controls> Your browser