Android에서 RTP 스트림으로 동영상을 보낼 수 없습니다.

요게 쉬 쿨 카르 니

카메라 출력을 rtp 스트림으로 서버에 보낼 Android 응용 프로그램을 만들려고하는데 예상대로 작동하지 않습니다. 다음 단계를 수행하고 있습니다.

  1. 활동 클래스에서 구현 된 SurfaceTextureListener인터페이스와 onCreate()생성 TextureView및 추가 된 리스너.

  2. In public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)메서드 생성 및 초기화 CameraMediaCodec카메라 출력을 H.264. 또한 다음과 같이 카메라에 대한 PreviewCallback을 추가했습니다.

    mCamera.setPreviewCallback(new Camera.PreviewCallback() {
    
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            // Here encode method will encode frame using Mediacodec and send it to LocalSocket.
            encode(data);
        }
    });
    
  3. 이제 또 AsyncTask이것을 읽어 LocalSocket와에게 보내 DatagramSocket각 패킷의 RTP 헤더를 추가하여.

  4. sdp 파일을 제공하여 VLC에서이 코드를 테스트하고 있지만 VLC가 비디오를 재생하지 않습니다. VLC에서 udp 소켓을 열면 udp://@:5001미디어 정보에서 VLC가 "Read At Media"및 "Input Bitrate"에 일부 데이터를 표시하고 있다는 것은 내 앱이 해당 udp 포트로 일부 데이터를 보내고 있음을 의미합니다. 또한 비디오를 안드로이드 장치에 저장하려고 시도했는데 내 앱이 동일한 코드 MediaCodedCamera코드 에서 적절한 비디오를 저장 하고 있습니다.

RTP 헤더 및 패킷 형성 코드

    int Version; // 2 bits
int Padding; // 1 bit
int Extension; // 1 bit
int CC; // 4 bits
int Marker; // 1 bit
int PayloadType=96; // 7 bits
int Ssrc; // 32 bits
Version = 2;
Padding = 0;
Extension = 0;
CC = 0;
Marker = 0;
Ssrc = 0;
byte[] header = new byte[ 12 ];
long timeStamp = System.currentTimeMillis();
mSeq = ++mSeq + 1;
header[0] = (byte)(Version << 6);
header[0] = (byte)(header[0] | Padding << 5);
header[0] = (byte)(header[0] | Extension << 4);
header[0] = (byte)(header[0] | CC);
header[1] = (byte)(header[1] | Marker << 7);
header[1] = (byte)(header[1] | PayloadType);
header[2] = (byte)(mSeq >> 8);
header[3] = (byte)(mSeq & 0xFF);
header[4] = (byte)(timeStamp >> 24);
header[5] = (byte)(timeStamp >> 16);
header[6] = (byte)(timeStamp >> 8);
header[7] = (byte)(timeStamp & 0xFF);
header[8] = (byte)(Ssrc >> 24);
header[9] = (byte)(Ssrc >> 16);
header[10] = (byte)(Ssrc >> 8);
header[11] = (byte)(Ssrc & 0xFF); 
mBuffers = new byte[1400];
System.arraycopy(header, 0, mBuffers, 0, header.length);
System.arraycopy(buf, 0, mBuffers, 12, buf.length);
DatagramPacket out = new DatagramPacket(mBuffers, mBuffers.length, hostAddress, 5001);
socket.send(out);

stackoverflow의 누군가가 AVC에서 첫 번째 4 바이트를 제거해야한다고 말하면서 처음 4 바이트의 패킷을 제거하여 코드를 수정하려고했습니다. 또한 내 RTP 헤더를 두 번 확인했지만 운이 없었습니다 ...

내 코드가 비디오를 rtp로 보내지 못하는 이유를 아십니까?

mstorsjo

RTP 헤더 만 추가 할 수는 없습니다. H264 RTP 페이로드 형식에 대해 하나 이상의 고정 길이 RTP 패킷 (일명 "패킷 화")에 맞게 인코딩 된 버퍼를 다시 형식화해야합니다 . 전체 사양 RFC 6184참조하십시오 .

H.264 패킷이 1400 패킷 크기에 맞을만큼 충분히 짧으면 처음 4 바이트 만 제거하면됩니다 (처음 4 바이트가 0, 0, 0, 1이라고 가정). 인코더의 출력 버퍼에 둘 이상의 NAL 단위가 포함되어있는 경우 (버퍼에 시퀀스 [0,] 0, 0, 1이 더 많이 발생하는 경우) 각 NAL 단위를 별도의 패킷으로 보내야합니다. , 또는보다 정교한 패킷 화 체계 중 하나를 사용하십시오. 이에 대한 자세한 내용은 RFC를 참조하십시오.

둘째, 현재 실제 인코딩 된 페이로드가 더 짧더라도 전체 1400 바이트 패킷을 전송하고 있습니다. 얼마나 많은 문제가 발생할 수 있는지 또는 눈에 띄지 않게 통과 할 수 있는지 잘 모르겠지만 실제로는 실제로 채운 바이트 수만 보내야합니다. (즉, 대신을 mBuffers.length사용하십시오 12 + buf.length.)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

PHP 스크립트에서 Android 앱으로 알림을 보낼 수 없습니다.

setTimeout에서 서버로 스트림을 보낼 수 없습니다.

크론 작업에서 알림을 보낼 수 없습니다.

Plesk에서 Laravel로 이메일을 보낼 수 없습니다

Google Play Console의 실시간 개발자 알림에서 테스트 알림을 보낼 수 없습니다.

파이썬에서는 출력을 텍스트 형식으로 내보낼 수 없습니다.

Rails / Devise : 컨트롤러에서 수동으로 확인 메일을 보낼 수 없습니다.

AJAX 호출에서 웹 서비스로 값을 보낼 수 없습니다.

Android는 기본적으로 udp / RTP / RTSP 스트림을 재생할 수 있습니까?

프로젝트 헤더에서 인증을 보낼 수 없습니다.

컨트롤러에서 대기열로 메일을 보낼 수 없습니다.

프로젝트 헤더에서 인증을 보낼 수 없습니다.

Firebase는 Android 앱에 푸시 알림을 보낼 수 없습니다.

Laravel: 로그인한 사용자에게 알림을 보낼 수 없습니다

sendkeys() 메서드에 인스턴스 변수 값을 보낼 수 없습니다.

Amazon EC2는 iOS에서 푸시 알림을 보낼 수 없습니다.

스레드에서 활동으로 이벤트를 보낼 수 있습니까?

codeigniter에서 이메일을 제대로 보낼 수 없습니다.

파이썬에서 arduino로 문자열을 보낼 수 없습니다.

PHP에서 PEAR 메일로 첨부 파일을 보낼 수 없습니다.

Python에서 Scrapy (1.5.1)로 이메일을 보낼 수 없습니다.

AppleScript 응용 프로그램에서 키 입력을 보낼 수 없습니다.

Laravel 앱 내부에서 Paypal Connect로 POST 요청을 보낼 수 없습니다.

Akka - F#에서 Discriminated Union을 메시지로 보낼 수 없습니다.

Typescript에서 상수를 내보낼 수 없습니다.

PHPMailer로 메일을 보낼 때 제목에 이모티콘을 보낼 수 없습니다.

다른 Jason 에이전트에게 작업을 보낼 수 없습니다.

Android에서 WhatsApp으로 텍스트 공유 "빈 메시지를 보낼 수 없습니다."

PHP를 사용하여 iOS에 푸시 알림을 보낼 수 없습니다.

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관