MPEG 전송 스트림의 FFmpeg 통과로 인해 스트림에 오류 및 결함이 발생함

MPEG 전송 스트림의 FFmpeg 통과로 인해 스트림에 오류 및 결함이 발생함

Unbescholtener Burger가 또 다른 FFmpeg 질문으로 돌아왔습니다. 내 목표는 RTP를 통해 mpeg 전송 스트림을 수신하고 트랜스코딩이나 필터링과 같은 수신된 스트림에서 임의의 작업을 실행한 다음 변경된 전송 스트림을 RTP를 통해 전달하는 FFmpeg 인스턴스를 실행하는 것입니다.

그러나 가장 기본적인 구성에서도 작동하지 않습니다. 하나의 비디오와 하나의 오디오 스트림으로 구성된 단일 프로그램이 포함된 .ts 파일이 있습니다. FFmpeg 인스턴스를 사용하여 이 파일을 localhost로 스트리밍합니다.

ffmpeg -re -i 1.ts -c copy -f rtp_mpegts rtp://127.0.0.1:5003

ffplay를 사용하여 이것이 올바르게 작동하는지 확인합니다.

ffplay -i rtp://127.0.0.1:5003

결과는 보기 좋고, 소리도 좋고, 콘솔에 오류 메시지가 표시되지 않습니다.

이제 그 사이에 또 ​​다른 FFmpeg 인스턴스를 넣으려고 하는데 상황이 나빠집니다. 추가 처리나 트랜스코딩 없이 FFmpeg가 포트 5003에서 포트 5005로 스트림을 복사하기를 원합니다.

ffmpeg -re -probesize 50M -analyzeduration 50M -i rtp://127.0.0.1:5003?fifo_size=10000 -c copy -f rtp_mpegts rtp://127.0.0.1:5005

해당 콘솔에서 반복되는 오류 메시지가 많이 나타나고 ffplay를 사용하여 포트 5005에서 스트림을 모니터링하면 많은 아티팩트, 결함 및 드롭아웃이 나타납니다. 콘솔 출력은 대부분 다음과 같습니다.

...
Input #0, rtp, from 'rtp://127.0.0.1:5003?fifo_size=10000':
  Duration: N/A, start: 1.400022, bitrate: N/A
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Output #0, rtp_mpegts, to 'rtp://127.0.0.1:5005':
  Metadata:
    encoder         : Lavf58.2.102
    Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc
    Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=0.0 q=-1.0 size=       0kB time=00:00:00.48 bitrate=   0.0kbits/s speed=0.957x
frame=    0 fps=0.0 q=-1.0 size=       0kB time=00:00:01.01 bitrate=   0.0kbits/s speed=0.991x
frame=    0 fps=0.0 q=-1.0 size=       0kB time=00:00:01.53 bitrate=   0.0kbits/s speed=1.01x 
frame=    1 fps=0.5 q=-1.0 size=      57kB time=00:00:02.05 bitrate= 227.6kbits/s speed=1.01x 
frame=   17 fps=6.7 q=-1.0 size=      83kB time=00:00:02.54 bitrate= 267.6kbits/s speed=   1x 
frame=   32 fps= 11 q=-1.0 size=     121kB time=00:00:03.04 bitrate= 324.9kbits/s speed=   1x 
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 50 packets
[rtp @ 0x3db64c0] PES packet size mismatch
frame=   37 fps= 10 q=-1.0 size=     132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.15x frame=   37 fps=9.1 q=-1.0 size=     132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.01x 
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
[rtp @ 0x3db64c0] PES packet size mismatch
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
frame=   47 fps= 10 q=-1.0 size=     150kB time=00:00:04.57 bitrate= 269.3kbits/s speed=1.01x
...

그럼... 무엇이 잘못됐는지, 어떻게 해결할 수 있는지 아시나요? 리소스 모니터를 보면 높은 CPU, 메모리 또는 네트워크 로드가 나타나지 않습니다.

답변1

분명히 내 문제는 -re통과 FFmpeg 인스턴스를 시작하는 명령의 플래그였습니다.

공식 문서를 미리 살펴보았다면 이런 질문을 할 필요도 없었을 것입니다.

-re(입력)

기본 프레임 속도로 입력을 읽습니다. 주로 그랩 장치 또는 실시간 입력 스트림(예: 파일에서 읽을 때)을 시뮬레이션하는 데 사용됩니다. 실제 그랩 장치 또는 라이브 입력 스트림(패킷 손실이 발생할 수 있음)과 함께 사용하면 안 됩니다.

http://ffmpeg.org/ffmpeg.html#고급 옵션

정확히 나에게 일어난 일입니다.

관련 정보