Повторное кодирование созданного vlc файла mpeg2 .ts приводит к 20-секундному файлу; AKA: многопотоковый файл со скрытыми потоками

Я записывал что-то с vlc выкл v4l2 (в случае, если это имеет значение), и я просто выбрал первый формат, который работал, будучи mpeg2 с использованием контейнера TS. Файл получил расширение.ts, так как он автоматически выбирается vlc. Когда я попытался поместить видеофайл в мой видеоредактор, он сказал, что видео длилось 19 884 часа, тогда как оно должно длиться около 6 минут (его размер ~80 МБ). Когда я пытаюсь воспроизвести его в Xine, он правильно показывает продолжительность (VLC не делает), и когда я использую ffprobe:

[mpegts @ 0x9b2c0a0] max_analyze_duration 5000000 reached at 5000000
Input #0, mpegts, from 'loopbacktestcap.ts':   Duration: N/A, start:
17978.139456, bitrate: N/A   Program 1 
     Stream #0:0[0x44](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30
tbr, 90k tbn, 60 tbc
     Stream #0:1[0x46](): Video: mpeg2video ([2][0][0][0] / 0x0002), 90k tbn

Обратите особое внимание на эту строку:

   Duration: N/A, start: 17978.139456, bitrate: N/A   Program 1 

Я посмотрел это, и кажется, что отсутствие продолжительности связано с контейнером. Но я попробовал несколько вещей, чтобы перекодировать (я пытался -vcodec copy, mpeg2, libx264...), и все, что я могу получить, это 20 секундные файлы от 1.1mb до 1.8mb.

Итак, как я могу перекодировать этот файл, чтобы появилась продолжительность, и я получил полные 6 минут вместо первых 20 секунд?

2 ответа

Решение

Первый рубеж был достигнут, когда я нашел эту ссылку: Карта - ffmpeg - Пример #8, которая побудила меня попробовать:

ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts

Дает следующее:

[mpegts @ 0x9980f40] max_analyze_duration 90000000 reached at 90000000
Input #0, mpegts, from 'loopbacktestcap.ts':
  Duration: 00:16:00.96, start: 17978.139456, bitrate: 695 kb/s
  Program 1 
    Stream #0:0[0x44](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:1[0x45](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x46](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc

Обратите внимание, что теперь он дает мне правильную продолжительность, а также дополнительный поток и дополнительную информацию о втором (который технически является третьим). Итак, я побежал:

ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0 -c copy map0.mp4

и это теперь произвело 79451050 байт файла map0.mp4, где my_mpeg2_file.ts равен 83499636. Я пытаюсь воспроизвести это в vlc, и он показывает продолжительность как 9:12, но если я перемещаю позицию воспроизведения, еще два окна vlc открыл и VLC начинает действовать странно; область отображения видео зависла, хотя индикатор позиции воспроизведения продолжает прогрессировать. Это может быть просто глючный VLC, но я застрял на этом этапе. Дайте мне знать, если кто-нибудь увидит что-то, чего мне здесь не хватает.

xine однако не может воспроизвести новый файл (где он воспроизводит оригинал и показывает, что он длится 6 минут - на самом деле, счетчик длительности становится немного сумасшедшим, когда я играю файл и постоянно меняется, поэтому я не знаю).

Итак, следующая команда, которую я попробовал, была:

ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0 -c libx264 map0x264.mp4

Попытка воспроизвести полученный файл (43652975 байт, для любопытных) привела к тому же странному поведению в vlc, где теперь я вижу, что он открывает новое окно для каждого потока и воспроизводит поток, когда наступает его "поворот" в соответствующем окне, замораживая другие области отображения других окон. Попытка закрыть их останавливает воспроизведение для всех и закрывает два дополнительных окна. Я предполагаю, что хранить все 3 потока в одном файле - нонсенс.

УСПЕХ!

Следующая попытка была:

ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0:0 -c copy map0_0.ts
ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0:1 -c copy map0_1.ts
ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0:2 -c copy map0_2.ts

что привело к файлам размером:

 4912 map0_0.ts
 5372 map0_1.ts
74728 map0_2.ts

Длина map0_0.ts составляет 20 секунд, map0_1.ts - это неподвижное изображение длиной 1:12, а map0_2.ts - 9:12. Именно то, что я хотел! И мой редактор видео принимает их без проблем. РЕШИТЬ!

У меня была похожая проблема с поддержкой видеофайлов транспортного потока (ts) в нашей инфраструктуре обработки видео. я использовал ffmpeg преобразовать ts в mp4 файлы с двухпроходной кодировкой.

Команда (ы) в полном объеме:

Пройдите 1:

ffmpeg -i camera.ts -filter:v scale=-1:480,setsar=1/1 -pix_fmt yuv420p -threads 0 -r 25/1 -force_fps -c:v libx264 -profile:v baseline -preset slow -x264opts level=3.0:ref=1 -b:v 1000k -maxrate 1000k -bufsize 2000k -s hd480 -c:a libfaac -ar 16000 -ac 2 -ab 128000 -pass 1 -movflags faststart -y video.mp4

Пройдите 2:

ffmpeg -i camera.ts -filter:v scale=-1:480,setsar=1/1 -pix_fmt yuv420p -threads 0 -r 25/1 -force_fps -c:v libx264 -profile:v baseline -preset slow -x264opts level=3.0:ref=1 -b:v 1000k -maxrate 1000k -bufsize 2000k -s hd480 -c:a libfaac -ar 16000 -ac 2 -ab 128000 -pass 2 -movflags faststart -y video.mp4 >>& ffmpeg.log

Я уменьшаю масштаб видео до hd480 (852x480) перекодирование видеопотока с libx264 базовый уровень 3 с относительно низким битрейтом, а также аудио с libfaac и перемещение атома moov в начало файла для веб-совместимости (-movflags faststart)

См. Документацию FFMpeg для всех деталей относительно флагов.

Обратите внимание, что я только что выкопал эту команду, которая работает для нашей настройки: обработка записей транспортного потока с IP-камер. Вам, вероятно, придется специально адаптировать разрешение и битрейт к вашим потребностям. Надеюсь, что это указывает вам в правильном направлении.

Другие вопросы по тегам