когда я открываю файл .m4a или .mp3 с помощью chrome (или в VLC «открыть новый поток») и перехожу к определенной отметке времени, он начинает потоковую передачу звука прямо в эту отметку времени, что означает, что он загружает фрагмент аудиофайла, начинающийся с этой позиции.
когда я проверяю сеть в Chrome Dev Tools после того, как щелкаю где-нибудь в аудиоплеере, и копирую запрос cURL, он содержит заголовок диапазона http, например:
-H "Range: bytes=26500000-30000000"
когда я запускаю эту команду cURL в терминале, выводится поврежденный аудиофайл. если я пытаюсь конвертировать его с помощью ffmpeg, он записывает:
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000164d5a3ab40] moov atom not found
единственное исключение - когда я запрашиваю диапазон байтов, начинающийся с 0 (и заканчивающийся на 300000+), и в этом случае выходной файл может воспроизводиться.
Из того, что я понимаю, заголовки аудиофайла не загружаются, когда диапазон байтов находится где-то посередине или в конце файла.
я попытался указать два диапазона следующим образом
-H "Range: bytes=0-300000,2000000-4000000"
но выходной файл все же поврежден.
как chrome / vlc справляется с этой ситуацией и как мне ее воспроизвести? Как правильно загрузить аудиоблок из большого аудиофайла? я предполагаю, что мне придется делать последовательные http-запросы для создания правильного, не поврежденного файла, кажется, что это то, что делает Chrome.
UPDATE
«временное исправление», которое я нашел для проблемы, которая может оказаться полезной, заключается в использовании запуска VLC через команду со скрытым интерфейсом, загрузке аудиопотока (в данном случае URL-адреса аудиофайла) и транскодировании звука в локальный файл при назначении времени начала и окончания. Например, со случайным подкастом:
vlc -Idummy --play-and-exit --sout "#transcode{acodec=s16l,channels=2,samplerate=44100}:std{access=file,mux=wav,dst=C:\audio\output.wav}" --start-time=600 --stop-time=630 "http://traffic.libsyn.com/preview/worldofhardwarestartups/World_of_Hardware_Startups_Podcast_EP01_-_AIR_Ready.mp3"
однако, оригинальная проблема все еще не решена.