2015-06-17 4 views
2

Я пишу простой HLS (Http Live Streaming) java-сервер, чтобы жить в прямом эфире (по-настоящему жить, а не по требованию). Я постоянно получаю фрагменты кадров изображений и звуковых сэмплов в качестве входных данных для моей службы и создаю mpeg 2 ts files + m3u8 плейлист в качестве выхода. Последовательность действия следующий:Как настроить mpeg 2 ts время запуска с помощью ffmpeg?

  1. Сбор (буфер) источник видеокадры и аудио для определенного периода времени
  2. Преобразования серии видеокадров в H.264 кодированное видео файл
  3. Преобразования аудио образцов в mp3 аудио файл
  4. Объединить их .ts файл с помощью команды FFmpeg

    ffmpeg -i audio.mp3 -i video.mp4 -f mpegts -c:a copy -c:v copy -vprofile main -level:v 4.0 -vbsf h264_mp4toannexb -flags -global_header segment.ts 
    
  5. Опубликовать несколько .ts файлов на плейлист m3u8.

Проблема заключается в прерываниях плей-листа после первого сегмента. VLC журналы следующие ошибки:

freetype error: Breaking unbreakable line 
ts error: libdvbpsi (PSI decoder): TS discontinuity (received 0, expected 4) for PID 17 
ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 0 
ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 4096 
core error: ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 1000 ms) 
core error: ES_OUT_RESET_PCR called 
core error: Could not convert timestamp 185529572000 
ts error: libdvbpsi (PSI decoder): TS discontinuity (received 0, expected 4) for PID 17 
ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 0 
ts error: libdvbpsi (PSI decoder): TS duplicate (received 0, expected 1) for PID 4096 
core error: ES_OUT_SET_(GROUP_)PCR is called too late (jitter of 8653 ms ignored) 
core error: Could not get display date for timestamp 0 
core error: Could not convert timestamp 185538017000 
core error: Could not convert timestamp 185538267000 
core error: Could not convert timestamp 185539295977 
... 

Я думаю, причина в том, что время начала сегментов не принадлежат к одному потоку, но это невозможно CONCAT и resegment (с ffmepg -f segment) весь поток сразу добавляется новая порция. Попробовал добавить #EXT-X-DISCONTINUITY тег в плейлист как suggested here, но это не помогло. Когда я ffprobe их я получаю:

Input #0, mpegts, from '26.ts': 
Duration: 00:00:10.02, start: 1.876978, bitrate: 105 kb/s 
Program 1 
Metadata: 
    service_name : Service01 
    service_provider: FFmpeg 
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0]/0x001B), yuv420p, 640x640, 4 fps, 4 tbr, 90k tbn, 8 tbc 
Stream #0:1[0x101]: Audio: mp3 ([3][0][0][0]/0x0003), 48000 Hz, mono, s16p, 64 kb/s 

Где начальное значение в строке Duration: 00:00:10.02, start: 1.876978, bitrate: 105 kb/s более или менее одинаковым для всех сегментов. При проверке сегменты из доступных списков воспроизведения доказано-к-работы (как http://vevoplaylist-live.hls.adaptive.level3.net/vevo/ch1/appleman.m3u8) все они имеют diffrenet начать значения для каждого сегмента, например:

Input #0, mpegts, from 'segm150518140104572-424570.ts': 
Duration: 00:00:06.17, start: 65884.808689, bitrate: 479 kb/s 
Program 257 
Stream #0:0[0x20]: Video: h264 (Constrained Baseline) ([27][0][0][0]/0x001B), yuv420p, 320x180 [SAR 1:1 DAR 16:9], 30 fps, 29.97 tbr, 90k tbn, 60 tbc 
Stream #0:1[0x21]: Audio: aac (LC) ([15][0][0][0]/0x000F), 44100 Hz, stereo, fltp, 115 kb/s 
Stream #0:2[0x22]: Data: timed_id3 (ID3/0x20334449) 

и следующие после того, как

Input #0, mpegts, from 'segm150518140104572-424571.ts': 
Duration: 00:00:06.22, start: 65890.814689, bitrate: 468 kb/s 
Program 257 
Stream #0:0[0x20]: Video: h264 (Constrained Baseline) ([27][0][0][0]/0x001B), yuv420p, 320x180 [SAR 1:1 DAR 16:9], 30 fps, 29.97 tbr, 90k tbn, 60 tbc 
Stream #0:1[0x21]: Audio: aac (LC) ([15][0][0][0]/0x000F), 44100 Hz, stereo, fltp, 124 kb/s 
Stream #0:2[0x22]: Data: timed_id3 (ID3/0x20334449) 

отличается в том, что время начала segm150518140104572-424571.ts равно времени начала + длительности segm150518140104572-424570.ts.

Как это начальное значение можно настроить с помощью ffmpeg? Или, может быть, мой аплоас ошибается? К сожалению, я не смог найти в Интернете рабочий пример видео-сервиса live (не по требованию), реализованного с помощью ffmepg.

+0

Можете ли вы поделиться своими 4-мя сегментами? вы можете отправить мне ссылки. Я буду использовать их в своем плейлисте и посмотреть, что происходит. – Alam

+0

@Alam [Вот примеры] (https: //www.dropbox.com/sh/kt13acxo459oz3q/AACV-OD9RXT9JNh9PMPnAuWEa? dl = 0) –

+0

Ваши сегменты 38.ts, 39.ts, 40.ts и 41.ts - это все те же файлы. (Проверьте свой буфер, если они обновляются) – Alam

ответ

1

Его больше, чем просто отметки времени, это также индикаторы непрерывности. Поэтому установка времени начала не решит вашу проблему. Вы должны кодировать как один поток.

+0

Но как это можно сделать, если это живое видео? –

1

Я ответил на свой вопрос с подходом here. Отметка может быть скорректирована с -initial_offset параметром формата -f segment:

ffmpeg -i in.ts -vcodec copy -acodec copy -f segment -initial_offset 10 -segment_format mpegts out%d.ts 

Для каждого нового сегмента рассчитать необходимо -initial_offset как сумма всех предыдущих сегментов длины.