叕探网络流媒体传输

本文记录了一次网络流媒体传输实验中遇到的问题,包括RTP版本不支持、类型匹配错误、PTS/DTS负数及编解码错误等。发送端和接收端均出现了错误提示,需要进一步研究解决。
摘要由CSDN通过智能技术生成

 

这是一次失败的传输试验,除了传输之外的都成功了,就差传输了。

问题1:发过去的内容提示RTP版本不支持

问题2:发过去接受的结构体显示if pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO,没错,是AVMEDIA_TYPE_AUDIO,而我发过去的明明完完全全的是AVMEDIA_TYPE_VIDEO。

问题3:多次尝试之后,PTS和DTS会有概率出现负数的问题、

问题4:发送端提示

[udp @ 0000019ae70abc80] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[udp @ 0000019ae70bbf40] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[rtp_mpegts @ 0000019ae70a9e00] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
[libx264 @ 0000019ae46a4fc0] non-strictly-monotonic PTS

接收端提示

a78140] decode_slice_header error
[h264 @ 000001f6d2a78140] no frame!
[h264 @ 000001f6d2a78140] non-existing PPS 0 referenced
[h264 @ 000001f6d2a78140] non-existing PPS 0 referenced
[h264 @ 000001f6d2a78140] decode_slice_header error
[h264 @ 000001f6d2a78140] no frame!

先记录一下,在慢慢研究

发送端:

/**
 * ref. 雷霄骅 Lei Xiaohua
//packet->pFrame->pFrameYUV->pPacket->send
 */
#include <stdio.h>
#include <iostream>
#include <winsock2.h>
#include <stdlib.h>  
#include <string.h>  
#include <memory.h>  
#pragma comment(lib,"ws2_32.lib")
#define __STDC_CONSTANT_MACROS
extern "C"
{
#include "include/libavcodec/avcodec.h"
#include "include/libavformat/avformat.h"
#include "include/libswscale/swscale.h"
#include "include/libavdevice/avdevice.h"
#include "include/libavutil/imgutils.h"
#include "include/libavutil/opt.h"
#include "include/libavutil/imgutils.h"
#include "include/libavutil/mathematics.h"
#include "include/libavutil/time.h"
//#include "includes/SDL.h"
};
#pragma pack(push,1)
struct sendbuf {
	AVPacket pPacket;
	char	buf[1500];
};
int Send(uint8_t * buf ,int size) {

	return 0;
}
struct sockaddr_in G_Servaddr;
#pragma pack(pop)

int main(int argc, char* argv[])
{
	AVFormatContext	*pFormatContext = NULL;
	int	i = 0, videoindex;
	AVCodecContext	*pCodecContext = NULL;
	AVCodec			*pCodec = NULL;
		
	FILE *fp_out;
	//fp_out = fopen("ds.h264", "wb");
	fp_out = fopen("ds.h264", "wb");
	AVPacket pPacket;	
	int y_size;
	FILE *fp_yuv = fopen("output.yuv", "wb+");
	struct SwsContext *img_convert_ctx;
	AVFormatContext	*pFormatContextEncod = NULL;
	AVCodecContext	*pCodecContextEncod = NULL;
	AVCodec			*pCodecEncod = NULL;
	//AVCodecID codec_id = AV_CODEC_ID_H264;//H.265和HEVC是同一个东西
	AVCodecID codec_id = AV_CODEC_ID_H264;//H.265和HEVC是同一个东西
	int in_w = 1920, in_h = 1080;
	int framenum = 100;
	int  ret, got_output, xy_size, got_picture;

	/*socket--------------------------------*/
	WSADATA wsa; 
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
	{
		printf("WSAStartup failed!\n");
		return 1;
	}

	int connfd;
	//socklen_t addrlen(0);
	SOCKET  ServerS = socket(AF_INET, SOCK_DGRAM, 0);
	SOCKADDR_IN DistAddr;
	DistAddr.sin_family = AF_INET;
	DistAddr.sin_port = htons(8800);
	DistAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //inet_addr("192.168.23.232");
	if (DistAddr.sin_addr.s_addr == INADDR_NONE)
	{
		printf("不可用地址!\n");
		return -1;
	}
	int time_out = 2000;
	//ret = setsockopt(ServerS, SOL_SOCKET, SO_RCVTIMEO, (char*)&time_out, sizeof(time_out))

	/*socket--------------------------------*/
	char	buf[1400];     //1500 bytes
	sendbuf buff;

	av_register_all();
	avformat_network_init();
	pFormatContext = avformat_alloc_context();
	avdevice_register_all();
	AVDictionary* options = NULL;
	av_dict_set(&options, "video_size", "1920*1080", 0);//设定捕捉范围
	av_dict_set(&options, "framerate", "25", 0);
	AVInputFormat *ifmt = av_find_input_format("gdigrab");
	if (avformat_open_input(&pFormatContext, "desktop", ifmt, &options) != 0)//输入流
	{		printf("Couldn't open input stream.\n");		return -1;	}

	if (avformat_find_stream_info(pFormatContext, NULL) < 0)//找到流
	{		printf("Couldn't find stream information.\n");		return -1;	}
	videoindex = -1;
	for (i = 0; i < pFormatContext->nb_streams; i++)
	{
		if (pFormatContext->streams[i]->codec->codec_typ
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值