ffmpeg摄像头推流
ffmpeg吧
全部回复
仅看楼主
level 2
使用ffmpeg,摄像头视频得到如下信息:
Input #0, dshow, from 'video=USB HD Webcam':
Duration: N/A, start: 22955.163000, bitrate: N/A
Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 30 fps, 30 tbr, 10000k tbn, 10000k tbc
另外本地搭建了rtmp服务器;
然后利用下面的函数实现解码、编码、推流的过程:
while (ret>=0)
{
ret=av_read_frame(fci, pkt);
index_frame++;
avcodec_send_packet(cci, pkt);
avcodec_receive_frame(cci, frm);
avcodec_send_frame(cco, frm);
avcodec_receive_packet(cco, pkt);
int64_t duration = AV_TIME_BASE / av_q2d(fci->streams[0]->r_frame_rate);
AVRational time_base1 = fci->streams[0]->time_base;
pkt->pts = index_frame*duration / (av_q2d(time_base1)*AV_TIME_BASE);
pkt->dts = pkt->pts;
pkt->duration = duration / (av_q2d(time_base1)*AV_TIME_BASE);
cout << "send " << index_frame << " frames" << endl;
cout <<"pts:"<< pkt->pts <<"\tduration:"<<pkt->duration<< endl;
//av_interleaved_write_frame(fco, pkt);
av_write_frame(fco, pkt);
av_packet_unref(pkt);
av_frame_unref(frm);
//av_usleep(300);
}
但是使用VLC或者ffplay进行拉流播放时,只有画面显示那一瞬间的画面被显示了出来。
各位大哥们,有知道怎么解决这个问题的吗?
2018年03月25日 12点03分 1
level 2
进行真正的解码和编码之前av_dump_format(,,,1)的输出信息如下:
[libx264 @ 0044b720] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0044b720] profile High 4:2:2, level 3.0, 4:2:2 8-bit
Output #0, flv, to 'rtmp://localhost:1935/live':
Stream #0:0: Video: h264 (libx264), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, q=-1--1, 30 fps, 30 tbr, 10000k tbn
2018年03月25日 12点03分 2
level 1
楼主这个问题怎么解决的? 我也遇到了相同的问题
2018年04月17日 05点04分 3
level 1
楼主怎么解决的, 我也遇到同样问题
2018年04月17日 05点04分 4
推流之前需要计算pkt->pts\dts\duration等,按照上面的计算方式,pts间隔太长了,应该在几分钟之后才能看到下一帧画面,rtmp服务器的time_base为{1,1000},所以最后rtmp解释时间戳是按ms来的,所以为了验证这个问题,可以手动设置pts,如pts以200为间隔,来看一下效果,如果播放正常再重新计算pts
2018年04月19日 07点04分
回复 软件大全😁 :谢谢 我也发现是时间戳的问题 已经解决 代码放楼下 希望能帮需要的人解决问题 ----- 我是老实人[乖]
2018年04月20日 02点04分
2018年04月23日 11点04分
level 1
pkt.pts = av_rescale_q_rnd(pFrame->pkt_pts, raw_video_st->time_base, video_st->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
pkt.dts = av_rescale_q_rnd(pFrame->pkt_dts, raw_video_st->time_base, video_st->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
pkt.duration = av_rescale_q(pFrame->pkt_duration, raw_video_st->time_base, video_st->time_base);
2018年04月20日 02点04分 5
1