Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
#1

Ffmpeg выдает moov atom not found если прервать процесс кодирования - C++

08.02.2016, 10:27. Просмотров 1863. Ответов 22
Метки нет (Все метки)

имеется код выполняющий кодирование и запись видео в файл (через avio_open2 / avformat_write_header / av_interleaved_write_frame / av_write_trailer / avio_close)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
extern "C" {
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libswscale/swscale.h>
}
 
#include <stdio.h>
#include <windows.h>
#include <time.h>
 
int main(int argc, char *argv[])
{
  AVFormatContext *ofcx;
  AVOutputFormat *ofmt;
  AVStream *ost;
 
  AVPacket pkt;
 
  const char *sFileOutput = "test.mp4";
 
  // Initialize library
  av_register_all();
  avformat_network_init();
 
  //
  // Output
  //
 
  //open output file
  ofmt = av_guess_format( NULL, sFileOutput, NULL );
  ofcx = avformat_alloc_context();
  ofcx->oformat = ofmt;
 
  int w = 800;
  int h = 600;
  int den = 25;
  int gop_size = 10;
  int codec_id = CODEC_ID_H264;
 
  // Create output stream
  AVCodec *ocodec = avcodec_find_encoder( (AVCodecID)codec_id );
  ost = avformat_new_stream( ofcx, ocodec );
  ost->codec->width = w;
  ost->codec->height = h;
  ost->codec->pix_fmt = ocodec->pix_fmts[0];
  ost->codec->time_base.num = 1; 
  ost->codec->time_base.den = den; 
  ost->time_base.num = 1;
  ost->time_base.den = den;
  ost->codec->gop_size = gop_size; 
  if ( ofcx->oformat->flags & AVFMT_GLOBALHEADER ) ost->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
  avcodec_open2( ost->codec, ocodec, 0 );
  
  AVFrame *frame = av_frame_alloc();
  frame->format = PIX_FMT_YUV420P;
  frame->width = w;
  frame->height = h;
  int buffer_size = avpicture_get_size(PIX_FMT_YUV420P, w, h);
  uint8_t *buffer = (uint8_t *)av_malloc(buffer_size * sizeof(uint8_t));
  avpicture_fill((AVPicture *)frame, 0, PIX_FMT_YUV420P, w, h);
 
  frame->data[0] = buffer;
  frame->data[1] = frame->data[0] + w * h;
  frame->data[2] = frame->data[1] + (w * h) / 4;
  frame->linesize[0] = w;
  frame->linesize[1] = w / 2;
  frame->linesize[2] = w / 2;
 
  avio_open2( &ofcx->pb, sFileOutput, AVIO_FLAG_WRITE, NULL, NULL );
 
  avformat_write_header( ofcx, NULL );
 
  av_init_packet( &pkt );
  for ( int i = 0; i < 25 * 10; i++ )
  {
        /* Y */
        for ( int y = 0; y < ost->codec->height; ++y ) {
            for ( int x = 0; x < ost->codec->width; ++x ) {
                frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
            }
        }
 
        /* Cb and Cr */
        for ( int y = 0; y < ost->codec->height / 2; ++y ) {
            for ( int x = 0; x < ost->codec->width / 2; ++x ) {
                frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
                frame->data[2][y * frame->linesize[2] + x] =  64 + x + i * 5;
            }
        }
 
        frame->pts = av_rescale_q(i, ost->codec->time_base, ost->time_base);
 
        int got_packet;
        if (avcodec_encode_video2(ost->codec, &pkt, frame, &got_packet) != 0) break;
 
        if (got_packet) 
        {
            av_interleaved_write_frame( ofcx, &pkt );
            av_free_packet( &pkt );
            avio_flush(ofcx->pb);
        }
  }
  av_write_trailer( ofcx );
  avio_close( ofcx->pb );
  avformat_free_context( ofcx );
 
  return 0;
}

если прервать процесс кодирования до вызова av_write_trailer (закрыть программу до того как процесс будет завершен, прервать выполнение программы завершив процесс из диспетчера задач, отключить питание ПК), то файл формируется неправильно и не может быть воспроизведен - ffprobe выдает сообщение
[mov,mp4,m4a,3gp,3g2,mj2 @ 00d44c20] moov atom not found
test.mp4: Invalid data found when processing input
castaway предложил код производящий прямую запись пакетов получаемых при кодировании на диск (через fopen / fwrite / fclose)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
 
extern "C" {
 #define __STDC_CONSTANT_MACROS
 #include <libavutil/opt.h>
 #include <libavutil/imgutils.h>
 #include <libavformat/avformat.h>
 #include <libavcodec/avcodec.h>
}
 
int main()
{
    avcodec_register_all();
    av_register_all();
 
    AVCodec * codec = avcodec_find_encoder( AV_CODEC_ID_H264 );
    if ( codec ) {
        AVCodecContext * avCtx = avcodec_alloc_context3( codec );
        if ( avCtx ) {
 
            /// MUST be set by user.
            avCtx->width    = 720;
            avCtx->height   = 304;
 
            /// Set by user.
            avCtx->pix_fmt  = AV_PIX_FMT_YUV420P;
 
            avCtx->gop_size = 10;
            avCtx->max_b_frames = 1;
 
            /// MUST be set by user.
            avCtx->time_base = (AVRational){ 1, 25 }; // 1/fps
 
            /// Set by user; unused for constant quantizer encoding.
            avCtx->bit_rate = 1024 * 256;
 
            av_opt_set( avCtx->priv_data, "preset", "slow", 0 );
 
            if ( avcodec_open2( avCtx, codec, 0 ) >= 0 ) {
                AVFrame * frame = av_frame_alloc();
                if ( frame ) {
                    frame->format = avCtx->pix_fmt;
                    frame->width  = avCtx->width;
                    frame->height = avCtx->height;
 
                    int ret = av_image_alloc( frame->data, frame->linesize, avCtx->width, avCtx->height, avCtx->pix_fmt, 32 );
                    if ( ret >= 0 ) {
 
                        FILE * fp = fopen( "out.mp4", "wb+" );
                        if ( !fp ) {
                            std::cerr << "can't open output file\n";
                            return 1;
                        }
 
                        AVPacket pkt;
                        int got_output;
                        for ( int i = 0; i < 25 * 10/*seconds*/; ++i ) {
                            av_init_packet( &pkt );
                            pkt.data = NULL; // packet data will be allocated by the encoder
                            pkt.size = 0;
 
                            /* Y */
                            for ( int y = 0; y < avCtx->height; ++y ) {
                                for ( int x = 0; x < avCtx->width; ++x ) {
                                    frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
                                }
                            }
 
                            /* Cb and Cr */
                            for ( int y = 0; y < avCtx->height / 2; ++y ) {
                                for ( int x = 0; x < avCtx->width / 2; ++x ) {
                                    frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
                                    frame->data[2][y * frame->linesize[2] + x] =  64 + x + i * 5;
                                }
                            }
                            frame->pts = i;
 
                            ret = avcodec_encode_video2( avCtx, &pkt, frame, &got_output );
                            if ( ret >= 0 && got_output ) {
                                fwrite( pkt.data, 1, pkt.size, fp );
                                av_packet_unref( &pkt );
                            }
                        }
 
                        /* get the delayed frames */
                        do {
                            ret = avcodec_encode_video2( avCtx, &pkt, NULL, &got_output );
                            if ( ret >= 0 && got_output ) {
                                fwrite( pkt.data, 1, pkt.size, fp );
                                av_packet_unref( &pkt );
                            }
                        } while ( got_output );
 
                        fclose( fp );
                    }
 
                    av_frame_free( &frame );
                }
            }
            av_free( avCtx );
        }
        avcodec_close( avCtx );
    }
}

файл формируемый этим кодом может быть воспроизведен даже в случае прерывания процесса кодирования. однако файлы получаемые в результате работы этого кода имеют некие особенности из-за которых они не могут быть воспроизведены например через VLC или KMP. вот что выдает ffprobe для файла формируемого моим кодом
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.30.100
Duration: 00:00:09.32, start: 0.000000, bitrate: 791 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600,
789 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
и вот что выдает ffprobe для кода castaway
Input #0, h264, from 'out.mp4':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p, 720x304, 25 fps, 25 tbr, 1200k tbn
, 50 tbc
видна некая "неполнота" файла...
вопрос - как правильно записывать файл содержащий всю необходимую для воспроизведения информацию что бы прерывание процесса кодирования не приводило к его повреждению? нужна либо правка моего метода делающая его устойчивым к прерыванию кодирования либо правка метода castaway формирующая файл корректно
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2016, 10:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ffmpeg выдает moov atom not found если прервать процесс кодирования (C++):

Если первый процесс за заданное время не выполнился, то прервать его и перейти к выполнению второго - C#
Помогите плиз с реализацией. У меня есть допустим 2 процесса. Каждому процессу назначается время на выполнение. Если 1-ый процесс за...

Как прервать процесс по кнопке в форме? - Visual Basic
ЕСТЬ ФОРМА В НЕЙ ДВЕ КНОПКИ ПЕРВАЯ ЗАПУСКАЕТ ЦИКЛ ПО ПЕРЕБОРУ ЗАПИСЕЙ В ТАБЛИЦЕ FOXPRO. ЧТО НУЖНО ПОВЕСТЬ НА ФОРМУ И КНОПКУ ЧТОБЫ ВОВРЕМЯ...

В процессе поиска после 5 итераций запрашиваем прервать процесс или нет - Turbo Pascal
В процессе поиска после 5 итераций запрашиваем прервать процесс или нет подскажите как это в проге написать

Так ли уж слаб Atom, или Atom vs. Pentium 4 - Процессоры
До сих пор Pentium 4 530 является основным моим процессором и менять его на что-то более мощное я совершенно не планировал. Однако жрёт он...

Отобразить процесс использования параметров тригонометрических функций для кодирования битов данных - MS Excel
Необходимо средствами EXСEL с помощью электронной таблицы отобразить процесс использования параметров тригонометрических функций для...

Nw.js. Запустить процесс. Command not found - Node.js
function Start() { const exec = require('child_process').exec; exec(&quot;node -v&quot;, (error, stdout, stderr) =&gt; { if (error) { ...

22
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
09.02.2016, 11:11 #16
Цитата Сообщение от vxg Посмотреть сообщение
может у вас что то выйдет?
Может быть. Я подумаю.

Добавлено через 20 минут
vxg, как я и предполагал, тут нужен другой контейнер.
Это работает так: ffmpeg -i in.mp4 -f segment -segment_time 10 -segment_format mpegts out%03d.mp4
Осталось опробовать это в программе... но не сегодня.

Добавлено через 12 часов 12 минут
Пробуйте такой вариант.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <windows.h>
#include <iostream>
 
extern "C" {
 #define __STDC_CONSTANT_MACROS
 #include <libavutil/opt.h>
 #include <libavutil/time.h>
 #include <libavutil/imgutils.h>
 #include <libavformat/avformat.h>
 #include <libavcodec/avcodec.h>
}
 
//#define CONSOLE_CTRL_HANDLER
 
#ifdef CONSOLE_CTRL_HANDLER
 
static BOOL g_bStop = FALSE;
static BOOL g_bCanExit = FALSE;
 
static BOOL WINAPI ctrl_handler( DWORD fdwCtrlType ) {
    switch ( fdwCtrlType ) {
        case CTRL_C_EVENT:
        case CTRL_CLOSE_EVENT:
        case CTRL_BREAK_EVENT:
        case CTRL_LOGOFF_EVENT:
        case CTRL_SHUTDOWN_EVENT:
            g_bStop = TRUE;
            while ( !g_bCanExit ) ::Sleep( 100 );
            return TRUE;
    }
    return FALSE;
}
#endif
 
int main()
{
#ifdef CONSOLE_CTRL_HANDLER
    ::SetConsoleCtrlHandler( ctrl_handler, TRUE );
#endif
 
    av_register_all();
 
    const char * filename = "out.ts";
 
    AVFormatContext * p_fmt_ctx;
    avformat_alloc_output_context2( &p_fmt_ctx, NULL, NULL, filename );
    if ( !p_fmt_ctx ) {
        std::cerr << "Could not deduce output format from file extension" << std::endl;
    } else {
        enum AVCodecID codec_id = AV_CODEC_ID_H264;
        AVCodec * p_codec = avcodec_find_encoder( codec_id );
        if ( !p_codec ) {
            std::cerr << "Could not find encoder for " << avcodec_get_name( codec_id ) << std::endl;
        } else {
            AVStream * p_stream = avformat_new_stream( p_fmt_ctx, p_codec );
            if ( !p_stream ) {
                std::cerr << "Could not allocate stream" << std::endl;
            } else {
                p_stream->id = p_fmt_ctx->nb_streams - 1;
 
                AVCodecContext * c = p_stream->codec;
                av_opt_set( c->priv_data, "preset", "slow", 0 );
 
                c->codec_id = codec_id;
 
                c->bit_rate = 1024 * 128;
                c->width    = 352;
                c->height   = 288;
 
                p_stream->time_base = (AVRational){ 1, 25 };
                c->time_base = p_stream->time_base;
 
                c->gop_size = 12; /* emit one intra frame every twelve frames at most */
                c->pix_fmt = AV_PIX_FMT_YUV420P;
 
                av_dump_format( p_fmt_ctx, 0, filename, 1 );
 
                /// open file
                avio_open2( &p_fmt_ctx->pb, filename, AVIO_FLAG_WRITE, NULL, NULL );
 
                /// write header
                if ( avformat_write_header( p_fmt_ctx, NULL ) != 0 ) {
                    std::cerr << "Could not write header" << std::endl;
                }
 
                /// open codec
                if ( avcodec_open2( c, p_codec, 0 ) >= 0 ) {
                    AVFrame * p_frame = av_frame_alloc();
                    if ( p_frame ) {
                        p_frame->format = c->pix_fmt;
                        p_frame->width  = c->width;
                        p_frame->height = c->height;
                        if ( av_image_alloc( p_frame->data, p_frame->linesize, c->width, c->height, c->pix_fmt, 32 ) >= 0 ) {
                            AVPacket pkt;
 
                            int got_output;
                            for ( int i = 0; /*i < 25 * 30*/
#ifdef CONSOLE_CTRL_HANDLER
                                    && !g_bStop
#endif
                                    ; ++i )
                            {
                                av_init_packet( &pkt );
                                pkt.data = NULL; // packet data will be allocated by the encoder
                                pkt.size = 0;
 
                                /* Y */
                                for ( int y = 0; y < c->height; ++y ) {
                                    for ( int x = 0; x < c->width; ++x ) {
                                        p_frame->data[0][y * p_frame->linesize[0] + x] = x + y + i * 3;
                                    }
                                }
 
                                /* Cb and Cr */
                                for ( int y = 0; y < c->height / 2; ++y ) {
                                    for ( int x = 0; x < c->width / 2; ++x ) {
                                        p_frame->data[1][y * p_frame->linesize[1] + x] = 128 + y + i * 2;
                                        p_frame->data[2][y * p_frame->linesize[2] + x] =  64 + x + i * 5;
                                    }
                                }
 
                                p_frame->pts = i * 25 * 30;//21;
                                //p_frame->pts = av_rescale_q( i, (AVRational){ 1, 25 }, (AVRational){ 1, 25 * 25 * 30 } );
 
                                int ret = avcodec_encode_video2( c, &pkt, p_frame, &got_output );
                                if ( ret >= 0 && got_output ) {
                                    av_interleaved_write_frame( p_fmt_ctx, &pkt );
                                    avio_flush( p_fmt_ctx->pb );
                                    av_packet_unref( &pkt );
                                }
                            }
 
                            /* get the delayed frames */
                            do {
                                int ret = avcodec_encode_video2( c, &pkt, NULL, &got_output );
                                if ( ret >= 0 && got_output ) {
                                    av_interleaved_write_frame( p_fmt_ctx, &pkt );
                                    avio_flush( p_fmt_ctx->pb );
                                    av_packet_unref( &pkt );
                                }
                            } while ( got_output
#ifdef CONSOLE_CTRL_HANDLER
                                && !g_bStop
#endif
                                );
 
                            av_freep( &p_frame->data[0] );
                        }
                        av_frame_free( &p_frame );
                    }
                    avcodec_close( c );
                }
 
                /// write trailer etc...
                av_write_trailer( p_fmt_ctx );
                avio_close( p_fmt_ctx->pb );
                avcodec_close( c );
            }
        }
    }
    avformat_free_context( p_fmt_ctx );
 
#ifdef CONSOLE_CTRL_HANDLER
    g_bCanExit = TRUE;
    ::SetConsoleCtrlHandler( ctrl_handler, FALSE );
#endif
}
Суть - другой контейнер - транспортный поток.
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
09.02.2016, 13:28  [ТС] #17
Цитата Сообщение от castaway Посмотреть сообщение
Пробуйте такой вариант
да, вроде работает! но как те люди сделали то же самое с mp4? или тот файл не mp4 на самом деле?
0
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
09.02.2016, 14:15 #18
Цитата Сообщение от vxg Посмотреть сообщение
но как те люди сделали то же самое с mp4? или тот файл не mp4 на самом деле?
mp4 - всего лишь расширение файла.
Тут следует разделять понятия контейнера и формата видеопотока.
У них, как и у нас, внутренний видеоформат - H264. Контейнер у них - MPEG, у нас - MPEG-TS.
Если вы захотите поменять контейнер на MPEG, то я думаю это не составит труда. С расширением то же самое.
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
09.02.2016, 15:22  [ТС] #19
Цитата Сообщение от castaway Посмотреть сообщение
Если вы захотите поменять контейнер на MPEG, то я думаю это не составит труда
а как?
0
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
10.02.2016, 19:00 #20
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от vxg Посмотреть сообщение
а как?
Самый простой вариант - поменять расширение на mpeg/mpg.
Но тут возникает небольшая проблема, о решении которой я сейчас думаю, как и про другие варианты...

Добавлено через 23 часа 35 минут
Цитата Сообщение от vxg Посмотреть сообщение
а как?
Независимо от имени файла:
C++
1
    avformat_alloc_output_context2( &p_fmt_ctx, NULL, "VOB", filename );
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
11.02.2016, 11:17  [ТС] #21
Цитата Сообщение от castaway Посмотреть сообщение
Независимо от имени файла
да! работает! причем имя файла при вызове не нужно так как задано имя формата. то есть можно вот так
C++
1
avformat_alloc_output_context2( &p_fmt_ctx, NULL, "VOB", NULL )
или например как у меня было только с именем формата
C++
1
2
3
  ofmt = av_guess_format( "VOB", NULL, NULL );
  ofcx = avformat_alloc_context();
  ofcx->oformat = ofmt;
правда при работе вываливает какие то ворнинги
[vob @ 009d90c0] VBV buffer size not set, using default size of 130KB
If you want the mpeg file to be compliant to some specification
Like DVD, VCD or others, make sure you set the correct buffer size
+немножко смущает что мы принудительно указываем формат вместо того что бы наилучший формат был выбран функцией av_guess_format по расширению файла. может по сути мы дурим систему? тот формат что мы указываем видимо не совсем соответствует расширению...
вот что дает ffprobe для файла формируемого через наилучший формат (видим что mp4 есть в списке)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.30.100
Duration: 00:00:09.32, start: 0.000000, bitrate: 791 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600,
789 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
вот что дает ffprobe для файла формируемого через принудительно указанный формат (видим что в списке вовсе нет mp4 - мы по факту пишем mpeg что ли?)
Input #0, mpeg, from 'test.mp4':
Duration: 00:00:09.32, start: 0.580000, bitrate: 803 kb/s
Stream #0:0[0x1e2]: Video: h264 (High), yuv420p, 800x600, 25 fps, 25 tbr, 90
k tbn, 50 tbc
одно обнадеживает - и там и там h264. кстати та программа которая умеет писать без сбоев видим делает тоже самое так как ее ffprobe выглядит похожим
Input #0, mpeg, from 'test.mp4':
Duration: 00:00:03.16, start: 25338.491000, bitrate: 4805 kb/s
Stream #0:0[0x1e0]: Video: h264 (Baseline), yuv420p, 1280x960, 25 fps, 25 tb
r, 90k tbn, 50 tbc
0
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
18.02.2016, 13:40 #22
Цитата Сообщение от vxg Посмотреть сообщение
+немножко смущает что мы принудительно указываем формат вместо того что бы наилучший формат был выбран функцией av_guess_format по расширению файла. может по сути мы дурим систему?
Вас не поймёшь. Вы хотели соответствия с тем что выдаёт ваш DVR - вы его получили.
То что мы указали формат видео вручную - это нормально. Формат контейнера MPEG-PS соответствует расширению mp4.
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
18.02.2016, 14:53  [ТС] #23
Понял спасибо!
0
18.02.2016, 14:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2016, 14:53
Привет! Вот еще темы с ответами:

Прервать выполнение, если сработало условие - C++ Builder
Проблема такого плана, при выполнении if(Q-&gt;IsEmpty()) Memo1-&gt;Lines-&gt;Add(&quot;Постановление № &quot; + StringGrid1-&gt;Cells + &quot; от &quot; +...

Как прервать программу если она зациклилась? - Turbo Pascal
Как прервать программу если она зациклилась? Заголовок темы изменен модератором. Он должен быть информативным, отображая...

Прервать работу батника, если FTP-сервер недоступен - CMD/BAT
У меня реализован батник с работой по фтп. Как прервать работу батника если фтп не доступно echo open 192.168.0.101 &gt;&gt;1.txt ...

javap выдает ошибку class not found - Java
Адрес класса C:\Users\Vitya\IdeaProjects\Security2\src\Main.java Содержание класса public class Main { public static void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru