Прохождение FFmpeg транспортного потока MPEG вызывает ошибки и сбои в потоке

2418
UnbescholtenerBuerger

Unbescholtener Bürger вернулся с другим вопросом FFmpeg. Моя цель - запустить экземпляр FFmpeg, который принимает транспортный поток mpeg через RTP, выполняет произвольные операции с полученным потоком, такие как перекодирование или фильтрация, а затем передает измененный транспортный поток через RTP.

Однако я не могу заставить его работать даже в самой базовой конфигурации: у меня есть файл .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 

Я получаю много повторяющихся сообщений об ошибках на этой консоли, и когда я наблюдаю за потоком через порт 5005 с помощью ffplay, появляется много артефактов, сбоев и выпадений. Консольный вывод выглядит по большей части так:

... 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 ... 

Итак ... есть идеи, что пошло не так и как это исправить? Взгляд на монитор ресурсов не указывает на высокую загрузку процессора, памяти или сети.

0
Можете ли вы предоставить пример файла .ts? 6 лет назад 0
Я мог бы, но это не будет законно, я думаю. Я скачал Bronski Beat - Smalltown Boy с YT и использовал FFmpeg, чтобы конвертировать его в .ts. В любом случае, это не имеет значения, потому что я действительно нашел виновника. UnbescholtenerBuerger 6 лет назад 0

1 ответ на вопрос

0
UnbescholtenerBuerger

Поэтому, очевидно, моей проблемой был -reфлаг в команде, которая запускает сквозной экземпляр FFmpeg.

Если бы я заглянул в официальную документацию заранее, мне не пришлось бы задавать этот вопрос:

-re (Вход)

Чтение ввода с частотой кадров. В основном используется для имитации устройства захвата или живого потока ввода (например, при чтении из файла). Не следует использовать с реальными устройствами захвата или живыми входными потоками (где это может привести к потере пакетов).

http://ffmpeg.org/ffmpeg.html#Advanced-options

Что именно и случилось со мной.

Похожие вопросы