Hi,
I'm trying to write a small C program to convert a given file from
MPEG-4 to MPEG-2. This will then be ported to Java (via Swig) and
integrated into an existing program, but I'm stumbling at segfaults.
I'm largely working from http://www.dranger.com/ffmpeg/tutorial01.html
, but it does not cover writing new files, so I am coding a little
blind.
If you have any suggestions, please let me have them.
ri...@ricky-desktop:~$ cd ffmpegplay/
ri...@ricky-desktop:~/ffmpegplay$ ls
a.out build.sh build.sh~ test.c test.c~
ri...@ricky-desktop:~/ffmpegplay$ cat build.sh
#!/bin/bash
gcc -std=c99 -I ~/ffmpeg/libavcodec/ -I ~/ffmpeg/libavformat/ -I
~/ffmpeg -L ~/ffmpeg/ -L ~/ffmpeg/libavformat/ -L ~/ffmpeg/libavcodec/
-L ~/ffmpeg/libavutil/ test.c -l avformat -l avcodec -l avutil -l
avformat -l avcodec -l avutil -l m -l
zri...@ricky-desktop:~/ffmpegplay$
ri...@ricky-desktop:~/ffmpegplay$ cat build.sh
#!/bin/bash
gcc -std=c99 -I ~/ffmpeg/libavcodec/ -I ~/ffmpeg/libavformat/ -I
~/ffmpeg -L ~/ffmpeg/ -L ~/ffmpeg/libavformat/ -L ~/ffmpeg/libavcodec/
-L ~/ffmpeg/libavutil/ test.c -l avformat -l avcodec -l avutil -l
avformat -l avcodec -l avutil -l m -l z
ri...@ricky-desktop:~/ffmpegplay$ cat test.c
#include "avcodec.h"
#include "avformat.h"
#include "imgconvert.h"
#include "stdio.h"
int main(int argc, char **argv) {
av_register_all();
AVFormatContext *formatContext;
if (av_open_input_file(&formatContext, argv[1], NULL, 0, NULL)!=0)
return -1;
if (av_find_stream_info(formatContext) < 0)
return -2;
dump_format(formatContext, 0, argv[1], 0);
AVCodecContext *codecContext;
int videoStream = -1;
for (int i = 0; i < formatContext->nb_streams; i++)
if (formatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO) {
videoStream = i;
break;
}
if (videoStream == -1)
return -3;
codecContext = formatContext->streams[videoStream]->codec;
AVOutputFormat *outputFormat = guess_format(NULL, argv[2], NULL);
if (outputFormat == NULL)
return -4;
AVFormatContext *outputFormatContext = av_alloc_format_context();
outputFormatContext->oformat = outputFormat;
strcpy(outputFormatContext->filename, argv[2]);
AVStream *outputStream;
av_new_stream(outputFormatContext, 0);
AVCodecContext *outputCodecContext;
outputCodecContext = outputStream->codec;
outputCodecContext->codec_id = CODEC_ID_MPEG2VIDEO;
outputCodecContext->codec_type = CODEC_TYPE_VIDEO;
outputCodecContext->width = 640;
outputCodecContext->height = 256;
outputCodecContext->bit_rate = 4000000;
outputCodecContext->time_base.num = 1;
outputCodecContext->time_base.den = 25;
outputCodecContext->pix_fmt = PIX_FMT_YUV420P;
outputCodecContext->flags = outputCodecContext->flags |
CODEC_FLAG_GLOBAL_HEADER;
outputCodecContext->gop_size = 12;
outputCodecContext->me_method = ME_ZERO;
AVCodec *encodeCodec = avcodec_find_encoder( outputCodecContext->codec_id );
avcodec_open( outputCodecContext, encodeCodec );
AVCodec *decodeCodec = avcodec_find_decoder( codecContext->codec_id );
if ( decodeCodec == NULL ) return -5;
AVFrame *frame = avcodec_alloc_frame();
AVFrame *frameRGB = avcodec_alloc_frame();
uint8_t *buffer;
int numBytes;
// Determine required buffer size and allocate buffer
numBytes=avpicture_get_size(PIX_FMT_RGB24, codecContext->width,
codecContext->height);
buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
avpicture_fill((AVPicture *)frame, buffer, PIX_FMT_RGB24,
codecContext->width, codecContext->height);
int frameFinished;
AVPacket packet;
int i=0;
while (av_read_frame(formatContext, &packet)>=0) {
if(packet.stream_index==videoStream) {
avcodec_decode_video(codecContext, frame, &frameFinished,
packet.data, packet.size);
if(frameFinished) {
img_convert((AVPicture *)frameRGB, PIX_FMT_RGB24,
(AVPicture*)frame, outputCodecContext->pix_fmt,
outputCodecContext->width,
outputCodecContext->height);
if (av_interleaved_write_frame(outputFormatContext,
&packet) < 0)
return -6;
}
}
av_free_packet(&packet);
}
return 0;
}
ri...@ricky-desktop:~/ffmpegplay$ ./build.sh
test.c: In function "main":
test.c:27: warning: "av_alloc_format_context" is deprecated (declared
at /home/ricky/ffmpeg/libavformat/avformat.h:873)
ri...@ricky-desktop:~/ffmpegplay$ file ~/cavity_flow_movie.mp4
/home/ricky/cavity_flow_movie.mp4: ISO Media, MPEG v4 system, version 2
ri...@ricky-desktop:~/ffmpegplay$ ./a.out ~/cavity_flow_movie.mp4
~/cavity_flow_movie.mp2
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/ricky/cavity_flow_movie.mp4':
Duration: 00:00:41.66, start: 0.000000, bitrate: 2301 kb/s
Stream #0.0(eng): Video: mpeg4, yuv420p, 320x240 [PAR 1:1 DAR
4:3], 30.00 tb(r)
Stream #0.1(eng): Data: mp4s / 0x7334706D
Stream #0.2(eng): Data: mp4s / 0x7334706D
Segmentation fault
--
Ricky Clarkson
Java Programmer, AD Holdings
+44 1565 770804
Skype: ricky_clarkson
Google Talk: [email protected]
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user