FMUSER 무선 전송 비디오 및 오디오가 더 쉬워졌습니다!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> 아프리칸스어
sq.fmuser.org -> 알바니아어
ar.fmuser.org -> 아랍어
hy.fmuser.org -> 아르메니아어
az.fmuser.org -> 아제르바이잔 어
eu.fmuser.org -> 바스크
be.fmuser.org -> 벨로루시 어
bg.fmuser.org -> 불가리아어
ca.fmuser.org -> 카탈로니아 어
zh-CN.fmuser.org -> 중국어 (간체)
zh-TW.fmuser.org -> 중국어 (번체)
hr.fmuser.org -> 크로아티아어
cs.fmuser.org -> 체코
da.fmuser.org -> 덴마크어
nl.fmuser.org -> 네덜란드어
et.fmuser.org -> 에스토니아어
tl.fmuser.org -> 필리피노
fi.fmuser.org -> 핀란드어
fr.fmuser.org -> 프랑스어
gl.fmuser.org -> 갈리시아어
ka.fmuser.org -> 조지아 어
de.fmuser.org -> 독일어
el.fmuser.org -> 그리스
ht.fmuser.org -> 아이티 크리올
iw.fmuser.org -> 히브리어
hi.fmuser.org -> 힌디어
hu.fmuser.org 헝가리어
is.fmuser.org -> 아이슬란드 어
id.fmuser.org -> 인도네시아어
ga.fmuser.org -> 아일랜드어
it.fmuser.org -> 이탈리아어
ja.fmuser.org -> 일본어
ko.fmuser.org -> 한국어
lv.fmuser.org -> 라트비아어
lt.fmuser.org 리투아니아어
mk.fmuser.org -> 마케도니아 어
ms.fmuser.org -> 말레이어
mt.fmuser.org -> 몰타어
no.fmuser.org -> 노르웨이어
fa.fmuser.org -> 페르시아어
pl.fmuser.org -> 폴란드어
pt.fmuser.org -> 포르투갈어
ro.fmuser.org -> 루마니아어
ru.fmuser.org -> 러시아어
sr.fmuser.org -> 세르비아어
sk.fmuser.org -> 슬로바키아어
sl.fmuser.org -> 슬로베니아어
es.fmuser.org -> 스페인어
sw.fmuser.org -> 스와힐리
sv.fmuser.org -> 스웨덴어
th.fmuser.org -> 태국
tr.fmuser.org -> 터키어
uk.fmuser.org -> 우크라이나어
ur.fmuser.org -> 우르두어
vi.fmuser.org -> 베트남어
cy.fmuser.org -> 웨일스 어
yi.fmuser.org -> 이디시어
H264
Nalu의 구조는 Nalu이고 Nalu의 구조는 nal head + rbsp입니다. 실제 전송의 데이터 흐름은 그림에 나와 있습니다.
다음은 사진 설명입니다.
다음 표에 표시된 것처럼 nal 헤더는 5 바이트를 설명하고 하위 XNUMX 비트 비트는 nal 유형을 나타냅니다.
NAL 유형 | Nal 유형 |
0 | 미사용 |
한 | 비 IDR 영화 |
두 | 데이터를 파티션으로 분할 |
세 | 슬라이스 데이터 파티션 B |
사 | 슬라이스 데이터 C 파티션 |
다섯 | IDR 이미지 필름 |
여섯 | SEI (Supplementary Enhancement Information Unit) |
일곱 | 시퀀스 매개 변수 세트 (SPS) |
여덟 | 이미지 매개 변수 세트 (PPS) |
구 | 경계 표시 |
안색 | 시퀀스 끝 |
열한 | 스트림의 끝 |
열두 | 채우기 |
13 23 .. | 유지 |
24 31 .. | 예약 없음 |
RBSP는 원래 바이트 시퀀스로드입니다.
최종 유형이 5 인 경우 프레임은 I 프레임, 즉 키 프레임이고 유형이 1 인 경우 비키 프레임 (P 프레임 ...)입니다.
실제 H264 데이터 프레임에서 프레임의 최종 유형은 일반적으로 00, 001 또는 00001 구분 기호가 앞에옵니다. 일반적으로 인코더에 의해 컴파일 된 첫 번째 프레임 데이터는 PPS 및 SPS, 프레임 I, P 프레임 순입니다.
Easypusher / easytmp 비디오 스트리밍 푸시
Easypusher 및 easytmp는 카메라 SDK 호출, RTSP 스트림 풀링, MP264 파일 읽기 등을 통해 H4 비디오 스트림 및 오디오 비디오 스트림을 로컬 비디오 소스로 가져온 다음 RTSP 및 RTMP를 통해 스트리밍 미디어 서버로 푸시하는 데 사용됩니다. 그들은 모두 Windows, Linux, Android, IOS, arm 및 기타 플랫폼을 지원하는 비디오 스트리밍 푸시 프로그램입니다.
다음은 비디오 스트림을 로컬로 가져온 후 푸시 한 후 I 프레임과 P 프레임을 구분하는 방법을 설명합니다.
//이 코드는 파일에서 H264 데이터를 읽고 서버로 푸시합니다.
unsigned char * ptr = new unsigned char [sample_ size];
fread (ptr, 샘플 _ 크기, 1, g_ fin);
// 데이터 프레임 작성-네트워크에서 직접 푸시 가능
// fwrite (ptr, 샘플 _ 크기, 1, fout);
EASY_ AV_ 프레임 avFrame;
memset (& avFrame, 0x00, sizeof (EASY_ AV_ Frame));
/*
* PTR의 처음 4 바이트는 프레임 분할 문자 0000001이고 다섯 번째 바이트는 nal 유형입니다.
*/
unsigned char naltype = ((unsigned char) ptr [4] & 0x1F);
avFrame.pBuffer = (부호없는 문자 *) ptr;
avFrame.u32AVFrameLen = 샘플 _ 크기;
avFrame.u32VFrameType = (naltype == 0x05)? EASY_ SDK_ VIDEO_ FRAME_ I : EASY_ SDK_ VIDEO_ FRAME_ P;
avFrame.u32AVFrameFlag = EASY_ SDK_ VIDEO_ FRAME_ FLAG;
avFrame.u32TimestampSec = lTimeStamp / 1000000;
avFrame.u32TimestampUsec = (lTimeStamp % 1000000);
비디오 소스가 파일이 아니라 IPcamera 또는 RTSP 스트림 인 경우 현재 프레임이 비디오 스트리밍 백 변조에서 I 프레임인지 P 프레임인지 이미 현재 프레임에 알렸을 수 있으므로 최종 판단 단계 유형은 생략됩니다.
HI_ S32 NETSDK_ APICALL OnStreamCallback (HI_ U32 u32handle, / * handle * /
HI_ U32 u32datatype, / * 데이터 유형, 비디오 또는 오디오 데이터 또는 오디오 비디오 복합 데이터 * /
HI_ U8 * pu8buffer, / * 데이터에 프레임 헤더 포함 * /
HI_ U32 u32length, / * 데이터 길이 * /
HI_ Void * puserdata / * 사용자 데이터 * /
)
{
HI_ S_ AVFrame * pstruAV = HI_ NULL;
HI_ S_ SysHeader * pstruSys = HI_ NULL;
if (u32DataType == HI_ NET_ DEV_ AV_ DATA)
{
pstruAV = (HI_ S_ AVFrame *) pu8Buffer;
if (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ VIDEO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) return 0;
if (pstruAV-> u32AVFrameLen> 0)
{
unsigned char * pbuf = (unsigned char *) (pu8Buffer + sizeof (HI_ S_ AVFrame));
EASY_ AV_ 프레임 avFrame;
memset (& avFrame, 0x00, sizeof (EASY_ AV_ Frame));
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen;
avFrame.pBuffer = (부호없는 문자 *) pbuf;
avFrame.u32VFrameType = (pstruAV-> u32VFrameType == HI_ NET_ DEV_ VIDEO_ FRAME_ I)? EASY_ SDK_ VIDEO_ FRAME_ I : EASY_ SDK_ VIDEO_ FRAME_ P;
avFrame.u32AVFrameFlag = EASY_ SDK_ VIDEO_ FRAME_ FLAG;
avFrame.u32TimestampSec = pstruAV-> u32AVFramePTS / 1000;
avFrame.u32TimestampUsec = (pstruAV-> u32AVFramePTS % 1000) * 1000;
EasyPusher_ PushFrame (fPusherHandle, & avFrame);
}
}
그렇지 않으면
if (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ AUDIO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) return 0;
if (pstruAV-> u32AVFrameLen> 0)
{
// 다른 IPcamera, 데이터 헤더는 여기에서 다르며 해당 크기는 SDK에 따라 건너 뛰어야합니다. 일부는 사용자 지정 데이터가 없을 수 있습니다.
unsigned char * pbuf = (unsigned char *) (pu8Buffer + sizeof (HI_ S_ AVFrame));
EASY_ AV_ 프레임 avFrame;
memset (& avFrame, 0x00, sizeof (EASY_ AV_ Frame));
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen-4; // 제조업체에서 정의한 4 바이트 헤더 제거
avFrame.pBuffer = (부호없는 문자 *) pbuf + 4;
avFrame.u32AVFrameFlag = EASY_ SDK_ AUDIO_ FRAME_ FLAG;
avFrame.u32TimestampSec = pstruAV-> u32AVFramePTS / 1000;
avFrame.u32TimestampUsec = (pstruAV-> u32AVFramePTS % 1000) * 1000;
EasyPusher_ PushFrame (fPusherHandle, & avFrame);
}
}
}
그렇지 않으면
if (u32DataType == HI_ NET_ DEV_ SYS_ DATA)
{
pstruSys = (HI_ S_ SysHeader *) pu8Buffer;
printf ( "비디오 W : % u H : % u 오디오 : % u \ n", pstruSys-> struVHeader.u32Width, pstruSys-> struVHeader.u32Height, pstruSys-> struAHeader.u32Format);
}
반환 HI_ SUCCESS;
}
데이터 소스를 사용하면 libeasypusher 또는 libeasyrtmp를 호출하여 RTSP 및 RTMP를 실시간으로 푸시 할 수 있습니다!
|
놀라움을 얻으려면 이메일을 입력하십시오.
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> 아프리칸스어
sq.fmuser.org -> 알바니아어
ar.fmuser.org -> 아랍어
hy.fmuser.org -> 아르메니아어
az.fmuser.org -> 아제르바이잔 어
eu.fmuser.org -> 바스크
be.fmuser.org -> 벨로루시 어
bg.fmuser.org -> 불가리아어
ca.fmuser.org -> 카탈로니아 어
zh-CN.fmuser.org -> 중국어 (간체)
zh-TW.fmuser.org -> 중국어 (번체)
hr.fmuser.org -> 크로아티아어
cs.fmuser.org -> 체코
da.fmuser.org -> 덴마크어
nl.fmuser.org -> 네덜란드어
et.fmuser.org -> 에스토니아어
tl.fmuser.org -> 필리피노
fi.fmuser.org -> 핀란드어
fr.fmuser.org -> 프랑스어
gl.fmuser.org -> 갈리시아어
ka.fmuser.org -> 조지아 어
de.fmuser.org -> 독일어
el.fmuser.org -> 그리스
ht.fmuser.org -> 아이티 크리올
iw.fmuser.org -> 히브리어
hi.fmuser.org -> 힌디어
hu.fmuser.org 헝가리어
is.fmuser.org -> 아이슬란드 어
id.fmuser.org -> 인도네시아어
ga.fmuser.org -> 아일랜드어
it.fmuser.org -> 이탈리아어
ja.fmuser.org -> 일본어
ko.fmuser.org -> 한국어
lv.fmuser.org -> 라트비아어
lt.fmuser.org 리투아니아어
mk.fmuser.org -> 마케도니아 어
ms.fmuser.org -> 말레이어
mt.fmuser.org -> 몰타어
no.fmuser.org -> 노르웨이어
fa.fmuser.org -> 페르시아어
pl.fmuser.org -> 폴란드어
pt.fmuser.org -> 포르투갈어
ro.fmuser.org -> 루마니아어
ru.fmuser.org -> 러시아어
sr.fmuser.org -> 세르비아어
sk.fmuser.org -> 슬로바키아어
sl.fmuser.org -> 슬로베니아어
es.fmuser.org -> 스페인어
sw.fmuser.org -> 스와힐리
sv.fmuser.org -> 스웨덴어
th.fmuser.org -> 태국
tr.fmuser.org -> 터키어
uk.fmuser.org -> 우크라이나어
ur.fmuser.org -> 우르두어
vi.fmuser.org -> 베트남어
cy.fmuser.org -> 웨일스 어
yi.fmuser.org -> 이디시어
FMUSER 무선 전송 비디오 및 오디오가 더 쉬워졌습니다!
연락처
주소:
No.305 Room HuiLan Building No.273 Huanpu Road 광저우 중국 510620
카테고리
MMCC 뉴스레터