Вопрос или проблема
Я конвертирую большое количество (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
, в то время как оригинальное .ts
– 30 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. Вы уже попробовали несколько методов, но проблема со звуком не исчезла. Давайте рассмотрим шаги для диагностики и решения вашей проблемы.
Возможные причины проблемы
-
Кодеки и их совместимость:
- Хотя вы используете кодек
aac
для звука иh264
для видео, стоит обратить внимание на настройки аудио- и видеопотоков. Иногда QuickTime имеет проблемы с определенными параметрами кодека.
- Хотя вы используете кодек
-
Синхронизация потоков:
- Неправильно синхронизированные аудио и видео потоки могут вызвать задержки и прерывания. Это может быть особенно заметно в определенные моменты времени при воспроизведении в течение длительного времени.
-
Проблемы с временными метками:
- При объединении файлов временные метки могут быть некорректно обработаны, что приводит к проблемам при воспроизведении.
Рекомендации по решению проблемы
-
Конвертация без копирования кодека:
Попробуйте перекодировать как видео, так и аудио потоки, вместо прямого копирования:ffmpeg -i video.ts -c:v libx264 -c:a aac -b:a 128k -movflags +faststart video.mp4
Здесь флаг
-movflags +faststart
позволяет начать воспроизведение файла быстрее, разместив метаданные в начале файла. -
Использование контенера
.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
-
Проверка параметров аудио и видео:
Убедитесь, что частота дискретизации аудио 44.1 кГц (что вы уже применяете) и очистите ваши.ts
файлы от потенциальных битых кадров или другого мусора, который может помешать нормальному воспроизведению. -
Использование библиотеки 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 для изучения дополнительных параметров, которые могут помочь в настройке кодирования и контейнеризации видео.
Если у вас будут дополнительные вопросы или понадобится дальнейшая помощь, не стесняйтесь обращаться!