Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Алгоритм обхода в игре "точки" http://www.cyberforum.ru/cpp/thread1657196.html
пишу игру "точки" на с++ в VS form, по клику заполняю два вектора с точками, vector<MyPoint> One; vector<MyPoint> Two; мне нужно найти все области длины одной клетки и проверить если там точка из другого вектора точек, не могу придумать алгоритм обхода, прощу помочь как можно скорее!! https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%87%D0%BA%D0%B8_(%D0%B8%D0%B3%D1%80%D0%B0) пробовал построение...
C++ Определение версии операционной системы Помогите пожалуйста! Написать программу которая определяет версию операционной системы http://www.cyberforum.ru/cpp/thread1657032.html
Марафон Безопасности C++
Суть марафона заключается в том, что хотелось бы увидеть как можно больше exe файлов на языке C++, в котором будет одно текстовое поле, в которое надо ввести ваш ключ/пароль и появится ваше кодовое слово (что-то типо получаем полный софт, введя ключ к программе), после чего вы выкладываете данную программу без исходников сюда, все ее анализируют и находят пароль к данной программе, после чего...
C++ Алгоритм обработки фотографий с "Google улицы"
есть ли в открытом доступе алгоритм обработки фотографий с google улицы
C++ Задания по C++ http://www.cyberforum.ru/cpp/thread1655759.html
Ребят помогите сделать задания: 1. Создайте структуру с именем time. Три ее поля, имеющие тип int, будут называться hours, minutes и seconds. Напишите программу которая просит пользователя ввести время, в формате часы, минуты и секунды.Программа должна хранить время в структурной переменной типа time и выводить количество секунд в веденном времени. 2. Создайте перечисление с именем pets и...
C++ Алгоритм обработки фотографий камеры 360 градусов Ребят есть ли какой код поясняющий принцип обработки этой камерой фотографий и предствлении их в формате 360 градусов или может кто знает на каком языке он может быть написан ( пишу в с++ потому что кажется что на ней) приму любую информацию подробнее

Показать сообщение отдельно
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
08.02.2016, 18:55     Ffmpeg выдает moov atom not found если прервать процесс кодирования
Пример завершения при закрытии консольного окна
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
#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>
}
 
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;
}
 
int main()
{
    ::SetConsoleCtrlHandler( ctrl_handler, TRUE );
    av_register_all();
 
    const char * filename = "out.mp4";
 
    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 &&*/ !g_bStop; ++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 && !g_bStop );
 
                            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 );
    g_bCanExit = TRUE;
    ::SetConsoleCtrlHandler( ctrl_handler, FALSE );
}

А вот при выключении ПК из розетки поток в любом случае останется поврежденным (недописанным).
Как вариант - делить выходной файл на сегменты. Вас это устроит?

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
Да даже если прервать.
Мне даже интересно стало. Сейчас попробую проверить как это работает.

Добавлено через 9 минут
vxg, у меня тут кое что не складывается... Вы можете привести пример командной строки перекодирования файла в сегментном режиме?
 
Текущее время: 09:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru