Проблема воспроизведения при конвертации .ts файлов в .mp4 с помощью FFMPEG

Вопрос или проблема

Я конвертирую большое количество (990) файлов .ts в видеофайл .mp4 с помощью ffmpeg.

Полученный файл .mp4 прекрасно воспроизводится в vlc, однако, когда я воспроизводлю его в QuickTime на Mac или, более конкретно, в моем собственном видеоплеере, который использует AVPlayerView, он воспроизводится нормально около 10 минут, а затем звук начинает скакать, то есть каждые 2 секунды происходит очень короткий заикание/пауза. Остановив видео и запустив его снова с той же точки, оно воспроизводится нормально еще около 10 минут.

Сначала я подумал, что это проблема в моем видеоприложении, но в QuickTime наблюдается такая же проблема.

Я объединяю все файлы .ts следующим образом:

ffmpeg -y -f concat -safe 0 -i list.txt -c copy video.ts

Затем я конвертирую это в .mp4 следующим образом:

ffmpeg -y -i video.ts -acodec copy -vcodec copy video.mp4

Другие вещи, которые я попробовал

Указание видеокодека:

ffmpeg -i video.ts -acodec copy -vcodec libx264 video.mp4

Сначала конвертация в .mkv:

ffmpeg -i video.ts -map 0 -c copy output.mkv
ffmpeg -i video.mkv -acodec copy -vcodec copy video.mp4

Конвертация в m4a:

ffmpeg -i video.ts -vcodec h264 -c:a aac video.mp4

Я заметил, что когда я использую ffprobe, он сообщает, что итоговое видео имеет 29.88 fps, в то время как оригинальное .ts30 fps. Я не уверен, является ли это проблемой, поэтому я попытался принудительно установить частоту кадров на одном уровне:

ffmpeg -i video.ts -acodec copy -filter:v fps=30 video.mp4

Ничто из вышеперечисленного, похоже, не даёт результата.

Может ли быть проблема в том, как объединяются файлы .ts? Хотя полный файл .ts кажется нормально воспроизводится в QuickTime. Есть ли другой способ, который я могу попробовать, чтобы объединить их?

Детали потока

Оригинальный отдельный файл .ts:

Input #0, mpegts, from '162.ts':
  Duration: 00:00:05.49, start: 883.612144, bitrate: 873 kb/s
  Program 1 
  Stream #0:0[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 130 kb/s
  Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn

Объединенный файл .ts:

Input #0, mpegts, from 'video.ts':
  Duration: 01:30:21.54, start: 1.400000, bitrate: 690 kb/s
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
  Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn
  Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 130 kb/s

Конвертировано в .mp4:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf61.1.100
  Duration: 01:30:21.56, start: 0.000000, bitrate: 616 kb/s
  Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 480 kb/s, 29.88 fps, 30 tbr, 90k tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]

Конвертировано с fps=30:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf61.1.100
  Duration: 01:30:21.56, start: 0.000000, bitrate: 768 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], 632 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
        encoder         : Lavc61.3.100 libx264
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]

playlist.m3u

#EXTM3U
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.00,
segment_1.ts
#EXTINF:10.00,
segment_2.ts

// Остальные ваши файлы здесь

#EXTINF:10.0,
segment_300.ts
#EXT-X-ENDLIST 

Затем выполните ffmpeg с файлом .m3u:

ffmpeg -i playlist.m3u -c copy output.mp4

Ответ или решение

Конвертация файлов .ts в .mp4 с использованием FFmpeg может иногда приводить к проблемам, связанным с воспроизведением, особенно в таких проигрывателях, как QuickTime или AVPlayerView. Вы уже попробовали несколько методов, но проблема со звуком не исчезла. Давайте рассмотрим шаги для диагностики и решения вашей проблемы.

Возможные причины проблемы

  1. Кодеки и их совместимость:

    • Хотя вы используете кодек aac для звука и h264 для видео, стоит обратить внимание на настройки аудио- и видеопотоков. Иногда QuickTime имеет проблемы с определенными параметрами кодека.
  2. Синхронизация потоков:

    • Неправильно синхронизированные аудио и видео потоки могут вызвать задержки и прерывания. Это может быть особенно заметно в определенные моменты времени при воспроизведении в течение длительного времени.
  3. Проблемы с временными метками:

    • При объединении файлов временные метки могут быть некорректно обработаны, что приводит к проблемам при воспроизведении.

Рекомендации по решению проблемы

  1. Конвертация без копирования кодека:
    Попробуйте перекодировать как видео, так и аудио потоки, вместо прямого копирования:

    ffmpeg -i video.ts -c:v libx264 -c:a aac -b:a 128k -movflags +faststart video.mp4

    Здесь флаг -movflags +faststart позволяет начать воспроизведение файла быстрее, разместив метаданные в начале файла.

  2. Использование контенера .mkv как промежуточного шага:
    Если проблема не исчезнет после перекодировки в .mp4, попробуйте использовать .mkv как промежуточный контейнер, а затем конвертировать в .mp4:

    ffmpeg -i video.ts -c copy output.mkv
    ffmpeg -i output.mkv -c:v libx264 -c:a aac -b:a 128k -movflags +faststart final_output.mp4
  3. Проверка параметров аудио и видео:
    Убедитесь, что частота дискретизации аудио 44.1 кГц (что вы уже применяете) и очистите ваши .ts файлы от потенциальных битых кадров или другого мусора, который может помешать нормальному воспроизведению.

  4. Использование библиотеки ffmpeg с правильными флагами:
    Попробуйте добавить флаги -vsync 1 или -vsync 2 при конвертации:

    ffmpeg -i video.ts -c:v libx264 -c:a aac -b:a 128k -movflags +faststart -vsync 1 final_output.mp4

Заключение

Следуя приведенным рекомендациям, вы сможете улучшить воспроизведение файла в QuickTime и AVPlayerView. Если проблема сохраняется, имеет смысл проверить исходные .ts файлы на наличие ошибок с помощью ffmpeg или ffprobe для выявления возможных неисправностей в этих файлах, а также обратиться к документации FFmpeg для изучения дополнительных параметров, которые могут помочь в настройке кодирования и контейнеризации видео.

Если у вас будут дополнительные вопросы или понадобится дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...