drkrol
Есть бот телеграме, которому отправляешь голосовое сообщение (формат oga), а он тебе в ответ отправляет mp3 файл. Я решил реализовать тоже самое: поставил на виртуалку ffmpeg, скормил боту голосовуху и получил mp3. Всё получилось, но меня смутила скорость выполнения скрипта. В моём случае скрипт выполнялся 3-4 секунды, а в случае с чужим ботом — меньше секунды (очень быстро, кажется, что где-то 300мс). Я связался с разработчиком того бота и он сказал, что бот написан на Python (у меня PHP) и самое главное, что выполнение конвертации сделано асинхронно, так как это была самая медленная часть скрипта. Я сделал замеры своего бота и получил такую картину:
(важный момент microtime был умножен на 1000, то есть 1860 — это 1.86 секунды)
Результат таймера
file_path — 312.7338886261
get link — 0.0030994415283203
ffmpeg — 1860.6932163239
send file — 916.67604446411
global — 3090.4860496521у меня самый медленный момент — тоже конвертация файла.
Вопрос: возможно ли как-нибудь запустить ffmpeg асинхронно?
1. я не заморачивался с названием и просто брал текущую метку времени для его имени.
2. я закомментировал строки с замерами, чтобы не отвлекалиКод (PHP):
function tlgrm($method, $data, $client = ‘получатель’) { $data[«parse_mode»] = «html»; $data[«chat_id»] = $client; curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => 1,CURLOPT_CUSTOMREQUEST => «POST»,CURLOPT_POSTFIELDS => $data]); } function tgfile($path) { return «https://api.telegram.org/file/апи бота/$path«; } $sec = «Результат таймераn«; // ПОЛУЧЕНИЕ #FILE_PATH # $t = microtime(1); $path = tlgrm(‘getFile’,[‘file_id’ => $tga[‘message’][‘voice’][‘file_id’]]); # $nt = (microtime(1) — $t)*1000; # $sec.= «file_path — $ntn»; // ПОЛУЧЕНИЕ ССЫЛКИ НА ФАЙЛ #GET LINK # $t = microtime(1); $link = tgfile($path[‘result’][‘file_path’]); # $nt = (microtime(1) — $t)*1000; # $sec.= «get link — $ntn»; // SHELL EXEC #FFMPEG # $t = microtime(1); # $nt = (microtime(1) — $t)*1000; # $sec.= «ffmpeg — $ntn»; // ОТПРАВКА ФАЙЛА #SEND FILE # $t = microtime(1); $data[‘audio’] = «https://mywebsite.com/tmp/$time.mp3″; // telegram отказался принимать относительную ссылку tlgrm(‘sendAudio’, $data); # $nt = (microtime(1) — $t)*1000; # $sec.= «send file — $ntn»; // ОТПРАВКА ОТЧЁТА $sec.= «global — $gt«; tlgrm(‘sendMessage’, $sec);p.s. меня, если честно, смутил ответ программиста, когда он сказал, что дело в асинхронности. Потому что данное действие является линейным: получение файла, конвертация, отправка. Нельзя конвертировать файл до того, как ты его получил. Но скорее всего здесь дело в инициализации ffmpeg. Если бы он был уже «заряжен», то возможно скорость была бы выше.
его слова:
musicman3
может просто железо разное?
drkrol
@musicman3 Я сейчас взял точно такую же машину как и у автора бота (4 ядра arm) и стало значительно быстрее, но я всё равно медленнее…
Сейчас мой скрипт выполняется в среднем 0,7 секунд, но у него вообще какие-то запредельные цифры. Я не преувеличиваю, когда говорю, что у него выполняется за 0,1-0,2 секунды (я говорю о голосовухе, которая длится 3 секунды). По факту у нас сейчас единственное отличие — это ЯП. Сервера у нас идентичные (я взял там же). Может ли php быть в 3 раза медленнее?p.s. я убрал из скрипта все замеры времени, чтобы не тратить лишние ресурсы.
musicman3
Скорее всего алгоримы написания разные. Возможно это связано с ЯП, а возможно разные программеры по своему усмотрению писали как им это виделось, и в одном случае алгоритм более продуманный и малоресурсный, а в другом вышло по другому. Ну и скорость ЯП может тоже как то еще влиять.
artoodetoo
Асинхронно запустить конечно можно, но это не уменьшит скорость возврата готового mp3! Это может ускорить выдачу сообщения типа «заявка на конвертацию принята, скоро пришлем файл».
Python vs. PHP — говно вопрос. В данной задаче разницы не будет, если не косячить.
Похожие записи:
- В чем разница между «-acodec» и «-c» в FFMPEG
- Порядок сортировки файлов по умолчанию, используемый командой «dir» / ядро Windows 10
- Как добавить функцию удаления найденного текста в строке?
- Почему возникает ошибка «ffmpeg exited with code 1: concat:file0.mp3: Invalid argument»?
- «Неизвестный вариант» ПУТЬ =[…]«» При следовании официальному руководству по компиляции ffmpeg