avformat - прямое копирование видео и перекодирование аудио в aac - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть видеофайл с контейнером mov, который содержит одно h264 видео и один alaw аудиопоток.

Я хотел бы воспроизвести его в браузере через MSE, но он не поддерживает alaw, поэтому ремуксинга недостаточно, аудиопоток должен быть перекодирован в aac.

Это мое намерение, поэтому я начал с transcode_aa c sample here .

Я могу транскодировать мой видеофайл (только для c audio), но если я также хочу скопировать видеопоток на выход, я получил ошибку, и я не уверен, что делать дальше.

Вот журнал транскодирования (пакет за пакетом), если я отключаю написание видео:

audioin : pts:     0 pts_time:       0 dts:     0 dts_time:       0 duration:1024 duration_time:      0.128 stream_index:1
audioin : pts:  1024 pts_time:   0.128 dts:  1024 dts_time:   0.128 duration: 896 duration_time:      0.112 stream_index:1
videoin : pts: 21600 pts_time:    0.24 dts: 21600 dts_time:    0.24 duration:   1 duration_time:1.11111e-05 stream_index:0
audioin : pts:  1920 pts_time:    0.24 dts:  1920 dts_time:    0.24 duration: 160 duration_time:       0.02 stream_index:1
audioout: pts: -1024 pts_time:  -0.128 dts: -1024 dts_time:  -0.128 duration:1024 duration_time:      0.128 stream_index:1
videoin : pts: 21601 pts_time:0.240011 dts: 21601 dts_time:0.240011 duration:   1 duration_time:1.11111e-05 stream_index:0
videoin : pts: 21602 pts_time:0.240022 dts: 21602 dts_time:0.240022 duration:   1 duration_time:1.11111e-05 stream_index:0
videoin : pts: 21603 pts_time:0.240033 dts: 21603 dts_time:0.240033 duration:   1 duration_time:1.11111e-05 stream_index:0
videoin : pts: 21604 pts_time:0.240044 dts: 21604 dts_time:0.240044 duration:   1 duration_time:1.11111e-05 stream_index:0
videoin : pts: 21605 pts_time:0.240056 dts: 21605 dts_time:0.240056 duration:   1 duration_time:1.11111e-05 stream_index:0
videoin : pts: 21606 pts_time:0.240067 dts: 21606 dts_time:0.240067 duration:3594 duration_time:  0.0399333 stream_index:0
audioin : pts:  2080 pts_time:    0.26 dts:  2080 dts_time:    0.26 duration: 160 duration_time:       0.02 stream_index:1
videoin : pts: 25200 pts_time:    0.28 dts: 25200 dts_time:    0.28 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  2240 pts_time:    0.28 dts:  2240 dts_time:    0.28 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 28800 pts_time:    0.32 dts: 28800 dts_time:    0.32 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  2560 pts_time:    0.32 dts:  2560 dts_time:    0.32 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 32400 pts_time:    0.36 dts: 32400 dts_time:    0.36 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  2880 pts_time:    0.36 dts:  2880 dts_time:    0.36 duration: 320 duration_time:       0.04 stream_index:1
audioout: pts:     0 pts_time:       0 dts:     0 dts_time:       0 duration:1024 duration_time:      0.128 stream_index:1
videoin : pts: 36000 pts_time:     0.4 dts: 36000 dts_time:     0.4 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  3200 pts_time:     0.4 dts:  3200 dts_time:     0.4 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 39600 pts_time:    0.44 dts: 39600 dts_time:    0.44 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  3520 pts_time:    0.44 dts:  3520 dts_time:    0.44 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 43200 pts_time:    0.48 dts: 43200 dts_time:    0.48 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  3840 pts_time:    0.48 dts:  3840 dts_time:    0.48 duration: 320 duration_time:       0.04 stream_index:1
audioout: pts:  1024 pts_time:   0.128 dts:  1024 dts_time:   0.128 duration:1024 duration_time:      0.128 stream_index:1
videoin : pts: 46800 pts_time:    0.52 dts: 46800 dts_time:    0.52 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  4160 pts_time:    0.52 dts:  4160 dts_time:    0.52 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 50400 pts_time:    0.56 dts: 50400 dts_time:    0.56 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  4480 pts_time:    0.56 dts:  4480 dts_time:    0.56 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 54000 pts_time:     0.6 dts: 54000 dts_time:     0.6 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  4800 pts_time:     0.6 dts:  4800 dts_time:     0.6 duration: 320 duration_time:       0.04 stream_index:1
audioout: pts:  2048 pts_time:   0.256 dts:  2048 dts_time:   0.256 duration:1024 duration_time:      0.128 stream_index:1
videoin : pts: 57600 pts_time:    0.64 dts: 57600 dts_time:    0.64 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  5120 pts_time:    0.64 dts:  5120 dts_time:    0.64 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 61200 pts_time:    0.68 dts: 61200 dts_time:    0.68 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  5440 pts_time:    0.68 dts:  5440 dts_time:    0.68 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 64800 pts_time:    0.72 dts: 64800 dts_time:    0.72 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  5760 pts_time:    0.72 dts:  5760 dts_time:    0.72 duration: 320 duration_time:       0.04 stream_index:1
videoin : pts: 68400 pts_time:    0.76 dts: 68400 dts_time:    0.76 duration:3600 duration_time:       0.04 stream_index:0
audioin : pts:  6080 pts_time:    0.76 dts:  6080 dts_time:    0.76 duration: 320 duration_time:       0.04 stream_index:1
audioout: pts:  3072 pts_time:   0.384 dts:  3072 dts_time:   0.384 duration:1024 duration_time:      0.128 stream_index:1

Но если я включу запись видео, процесс завершится, потому что он нарушает какое-то внутреннее правило (утверждают):

audioin : pts:     0 pts_time:       0 dts:     0 dts_time:       0 duration:1024 duration_time:      0.128 stream_index:1
audioin : pts:  1024 pts_time:   0.128 dts:  1024 dts_time:   0.128 duration: 896 duration_time:      0.112 stream_index:1
videoin : pts: 21600 pts_time:    0.24 dts: 21600 dts_time:    0.24 duration:   1 duration_time:1.11111e-05 stream_index:0
videoout: pts: 21600 pts_time:    0.24 dts: 21600 dts_time:    0.24 duration:   1 duration_time:1.11111e-05 stream_index:0
audioin : pts:  1920 pts_time:    0.24 dts:  1920 dts_time:    0.24 duration: 160 duration_time:       0.02 stream_index:1
audioout: pts: -1024 pts_time:  -0.128 dts: -1024 dts_time:  -0.128 duration:1024 duration_time:      0.128 stream_index:1
videoin : pts: 21601 pts_time:0.240011 dts: 21601 dts_time:0.240011 duration:   1 duration_time:1.11111e-05 stream_index:0
videoout: pts: 21601 pts_time:0.240011 dts: 21601 dts_time:0.240011 duration:   1 duration_time:1.11111e-05 stream_index:0
[mp4 @ 0x5562e89b5b80] Packets poorly interleaved, failed to avoid negative timestamp -2944 in stream 1.
Try -max_interleave_delta 0 as a possible workaround.
Assertion next_dts >= 0 failed at libavformat/movenc.c:1025

Я читал об отрицательных очках значения:

Кодеры будут выдавать отрицательные метки времени, когда они имеют задержку. В противном случае они вызовут A / V desyn c, так как аудио задерживается.

Из этой темы: https://lists.ffmpeg.org/pipermail/libav-user/2015-October/008548.html

Так что аа * Кодер 1041 * дает мне отрицательный PTS, но затем процесс завершается неудачей.

Как мне решить эту проблему?

Выходной контейнер - mp4, это важно. Другие контейнеры могут допускать отрицательное значение next_dts, но mp4 - нет.

...