mplayer и нестандартные mp4 файлы.

Ответить
Сквозняк
Сообщения: 70
Зарегистрирован: 25 сен 2023, 22:57
Operating system: Роса, Федора, Бубунта, Дос, Маздайка

mplayer и нестандартные mp4 файлы.

Сообщение Сквозняк »

Проблеме как оказалось много лет, для себя её решил, может ещё кому решение понадобится.
Есть боты, которые качают с ютуба видеофайлы в контейнере mp4, в котором находится видео, закодированное vp09 кодеком.
Пример такого файла https://disk.yandex.ru/i/NI-8zD0n_VQkZQ
Насколько это соответствует формату, вопрос философский, но многие плееры научились это проигрывать. Кроме mplayer. Для него такой нестандартный mp4 нужно конвертировать через mkvtoolnix в mkv формат, отчего кодек vp09 переименуется в V_VP9 и станет нормально проигрываться эмплаером. Очевидно, что проигрывание матрёшки в плеере реализовано лучше чем проигрывание mp4. Конвертирование mp4 в mkv происходит без перекодирования и не потребляет много ресурсов.
Survolog
Сообщения: 412
Зарегистрирован: 30 авг 2016, 22:30
Operating system: ROSA Fresh
Писать в Телеграм или ВК.

mplayer и нестандартные mp4 файлы.

Сообщение Survolog »

Может дело правда в отсутствии синонима?

Греп по исходнику.
$ grep -r "V_VP9"
libmpdemux/matroska.h:#define MKV_V_VP9 "V_VP9"
libmpdemux/demux_mkv.c: {MKV_V_VP9, mmioFOURCC('V', 'P', '9', '0'), 0},

$ grep -r "vp09"
Пусто

$ grep -r "#define MP4"
libmpdemux/parse_mp4.h:#define MP4ODescrTag 0x01
libmpdemux/parse_mp4.h:#define MP4IODescrTag 0x02
libmpdemux/parse_mp4.h:#define MP4ESDescrTag 0x03
...

Довольно много места для фантазии, что добавить, и что на что поменять.
Сквозняк
Сообщения: 70
Зарегистрирован: 25 сен 2023, 22:57
Operating system: Роса, Федора, Бубунта, Дос, Маздайка

mplayer и нестандартные mp4 файлы.

Сообщение Сквозняк »

Survolog писал(а): 26 янв 2025, 12:41 Может дело правда в отсутствии синонима?

Довольно много места для фантазии, что добавить, и что на что поменять.
Возможно, но если бы где-то там рядом было написано 264 или avc1, то было ясно, куда это впихивать чтобы сработало при выполнении. Пока же выходит, что нужно рыть начиная с функции int init_best_video_codec и смотреть, на каком этапе идёт не так и куда ведут ниточки. Технология "Буратилло идёт по следу" :D

Код: Выделить всё

int init_best_video_codec(sh_video_t *sh_video, char **video_codec_list,
                          char **video_fm_list)
{
    char *vc_l_default[2] = { "", (char *) NULL };
    stringset_t selected;
    // hack:
    printf("-w----------0-1-----\n");
    printf("-----------81----- %c\n", video_codec_list);
    printf("-----------82----- %c\n", video_fm_list);
    printf("-----------83----- %s\n", video_codec_list);
    printf("-----------84----- %s\n", video_fm_list);
    printf("-----------85----- %s\n", vc_l_default);
    printf("-w----------0-2-----\n");
    if (!video_codec_list) printf("-w---ikjkjuigyuguy---------------");
    if (!video_codec_list)
        video_codec_list = vc_l_default;
     printf("-----------83_2----- %s\n", video_codec_list[0]);
    printf("-----------83_3----- %s\n", video_codec_list[1]);
    printf("-----------83_4----- %s\n", video_codec_list[2]);   
    // Go through the codec.conf and find the best codec...
    sh_video->initialized = 0;
    printf("-----------86----- %s\n", selected);
    stringset_init(&selected);
    while (!sh_video->initialized && *video_codec_list) {
        char *video_codec = *(video_codec_list++);
 //   printf("-----------87----- %s\n", video_codec[0]);
//    printf("-----------88----- %s\n", video_codec[1]);
//    printf("-----------89----- %s\n", video_codec[2]);        
         printf("-----------90----- %s\n", video_codec);
        if (video_codec[0]) {
            if (video_codec[0] == '-') {
                // disable this codec:
                stringset_add(&selected, video_codec + 1);
            } else {
                // forced codec by name:
                mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_ForcedVideoCodec,
                       video_codec);
                init_video(sh_video, video_codec, NULL, -1, &selected);
            }
        } else {
            int status;
            // try in stability order: UNTESTED, WORKING, BUGGY. never try CRASHING.
            if (video_fm_list) {
                char **fmlist = video_fm_list;
                // try first the preferred codec families:
                while (!sh_video->initialized && *fmlist) {
                    char *video_fm = *(fmlist++);
                    mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_TryForceVideoFmtStr,
                           video_fm);
                    for (status = CODECS_STATUS__MAX;
                         status >= CODECS_STATUS__MIN; --status)
                        if (init_video
                            (sh_video, NULL, video_fm, status, &selected))
                            break;
                }
            }
            if (!sh_video->initialized)
                for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN;
                     --status)
                    if (init_video(sh_video, NULL, NULL, status, &selected))
                        break;
        }
    }
    stringset_free(&selected);

    if (!sh_video->initialized) {
        printf("-w----------1-----\n");
        mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantFindVideoCodec,
               sh_video->format);
        printf("-w----------2-----\n");
        return 0;               // failed
    }

    mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_SelectedVideoCodec,
           codec_idx2str(sh_video->codec->name_idx),
           codec_idx2str(sh_video->codec->drv_idx),
           codec_idx2str(sh_video->codec->info_idx));
    return 1;                   // success
}
И вот такой выхлоп в консоли с 866 кодировкой:

Код: Выделить всё

==========================================================================
-e----------1-----
-w----------0-1-----
-----------81----- 
-----------82----- 
-----------83----- (null)
-----------84----- (null)
-----------85----- ┤Н.йU
-w----------0-2-----
-w---ikjkjuigyuguy--------------------------83_2----- 
-----------83_3----- (null)
-----------83_4----- -e----------1-----
-----------86----- Г° ЕS   ╕    щL   f.Д
-----------90----- 
-w----------1-----
Cannot find codec matching selected -vo and video format 0x39307076.
-w----------2-----
-e----------3-----
==========================================================================
Прочитать название хоть одного кодека пока не удалось. В Си очень хентайный printf, для него давно нужно было сделать шапку в виде writeln и write.
Сквозняк
Сообщения: 70
Зарегистрирован: 25 сен 2023, 22:57
Operating system: Роса, Федора, Бубунта, Дос, Маздайка

mplayer и нестандартные mp4 файлы.

Сообщение Сквозняк »

Проблема вырисовывается в том, что в файле dec_video.c, функции static int init_video( не дают записать в переменную sh_video->codec->name_idx Какой-то испохабленный указатель.
Аватара пользователя
VictorR2007
Сообщения: 7808
Зарегистрирован: 12 сен 2011, 13:00
Operating system: ROSA 2023.1

mplayer и нестандартные mp4 файлы.

Сообщение VictorR2007 »

Сквозняк писал(а): 23 янв 2025, 16:37 Проблеме как оказалось много лет
Может просто забили на неё, так как переключились на mplayer2.
В новой версии этот файл без проблем воспроизводится.
Сам mplayer в 2021.1 обновлен на версию 1.4 аж 18 июня, 2020.
В rosa13 пакет mplayer обновлялся из git 2024-04-13.
В основном везде используется mplayer2 aka mpv.
Для сборки и работы проигрывателей нужен именно он.
Для baka-mplayer, haruna, xt7-player-mpv и mpc-qt.
Вложения
Снимок экрана_20250129_105711.jpeg
Сквозняк
Сообщения: 70
Зарегистрирован: 25 сен 2023, 22:57
Operating system: Роса, Федора, Бубунта, Дос, Маздайка

mplayer и нестандартные mp4 файлы.

Сообщение Сквозняк »

VictorR2007 писал(а): 29 янв 2025, 11:39 Может просто забили на неё, так как переключились на mplayer2.
Думаю, что в своё время неинформативный багрепорт написали разработчикам эмплаера. Код ошибки, а он такой, что понять по нему сложно, а поняв, нужно ещё такой неправильный файл для тестов раздобыть, вот и не стали заморачиваться, раз случается редко. Наверно такие файлы делают для железячных плееров, которые только мп4 принимают, лишний кодек им пришить проще, чем ещё и матрёшке обучать.

Так-то mpv умеет больше, вот только в консоль сводку не выдаёт. Пишет только "Cannot load libcuda.so.1" и всё. Для винды это может и плюс, а в линуксе информация в терминале не напрягает. Прикольно запускать mplayer вместе с консолью и посматривать что проигрывается. А раз зашёл вопрос про выхлоп в терминал, то хочу узнать, как в росе обстоит дело с контролем размера файла .xsession-errors Здесь он тоже может выжрать всё пространство хомяка? Такое случается, если система долго не перезагружается, а какое-то приложение начинает спамить в терминал. Когда-то писал для федоры утилиту, которая при достижении этим файлом определённого размера усекает его. Баш его усекать не умел, компилируемым бинарём резать приходилось. Удалять этот файл во время работы линукса нельзя, потому что система продолжает какать в открытый сокет продолжая уменьшать свободное пространство, но уже безконтрольно. Может из-за этого в mpv такая молчанка в терминале, хотя он там за сутки гигабайты текста не наложит, не из-за чего было на таких объёмах экономить :) Что-то у меня файл прошлогодний, новых данных в него не поступало, значит вопрос его размера решили радикально.
Ответить

Вернуться в «Программы РОСА десктоп»