
Recherche avancée
Médias (91)
-
Chuck D with Fine Arts Militia - No Meaning No
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Paul Westerberg - Looking Up in Heaven
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Le Tigre - Fake French
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Thievery Corporation - DC 3000
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Dan the Automator - Relaxation Spa Treatment
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Gilberto Gil - Oslodum
15 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
Autres articles (111)
-
Le profil des utilisateurs
12 avril 2011, parChaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...) -
Configurer la prise en compte des langues
15 novembre 2010, parAccéder à la configuration et ajouter des langues prises en compte
Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...) -
XMP PHP
13 mai 2011, parDixit Wikipedia, XMP signifie :
Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...)
Sur d’autres sites (11358)
-
ffmpeg stops randomly with "No more output streams to write to, finishing" when reading rtsp stream [on hold]
7 juin 2016, par ImagineDragonBasically I am running the following ffmpeg command to read an h264 rtsp stream using hls muxer, under Ubuntu 14.04 64bit with i7 CPU and 8GB memory :
ffmpeg -v debug -i rtsp://172.16.11.247:554/live/ch00_0?token=hQttXvrjSPOcClQB -codec copy -flags -global_header -f hls -hls_time 5 -use_localtime 1 -hls_segment_filename '/home/eason/ffmpeg-test/%s.ts' '/home/eason/ffmpeg-test/live.m3u8'
ffmpeg version N-79139-gde1a0d4 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.1)
configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --mandir=/usr/share/man --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libfreetype --enable-gnutls --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvidstab
libavutil 55. 19.100 / 55. 19.100
libavcodec 57. 30.100 / 57. 30.100
libavformat 57. 29.101 / 57. 29.101
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 40.102 / 6. 40.102
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Splitting the commandline.
Reading option '-v' ... matched as option 'v' (set logging level) with argument 'debug'.
Reading option '-re' ... matched as option 're' (read input at native frame rate) with argument '1'.
Reading option '-i' ... matched as input file with argument 'rtsp://172.16.11.247:554/live/ch00_0?token=hQttXvrjSPOcClQB'.
Reading option '-codec' ... matched as option 'codec' (codec name) with argument 'copy'.
Reading option '-flags' ... matched as AVOption 'flags' with argument '-global_header'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'hls'.
Reading option '-hls_time' ... matched as AVOption 'hls_time' with argument '5'.
Reading option '-use_localtime' ... matched as AVOption 'use_localtime' with argument '1'.
Reading option '-hls_segment_filename' ... matched as AVOption 'hls_segment_filename' with argument '/home/eason/ffmpeg-test/%s.ts'.
Reading option '/home/eason/ffmpeg-test/live.m3u8' ... matched as output file.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option v (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input file rtsp://172.16.11.247:554/live/ch00_0?token=hQttXvrjSPOcClQB.
Applying option re (read input at native frame rate) with argument 1.
Successfully parsed a group of options.
Opening an input file: rtsp://172.16.11.247:554/live/ch00_0?token=hQttXvrjSPOcClQB.
[tcp @ 0x29c4d60] No default whitelist set
[rtsp @ 0x29c2e20] SDP:
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=640028;sprop-parameter-sets=Z2QAKKzoBQBbkA==,aO48sA==
a=control:trackID=0
m=audio 0 RTP/AVP 98
a=rtpmap:98 MPEG4-GENERIC/16000/1
a=fmtp:98 profile-level-id=1;mode=AAC-lbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1408;cpresent=0;
a=control:trackID=1
[rtsp @ 0x29c2e20] video codec set to: h264
[rtsp @ 0x29c2e20] RTP Packetization Mode: 1
[rtsp @ 0x29c2e20] RTP Profile IDC: 64 Profile IOP: 0 Level: 28
[rtsp @ 0x29c2e20] Extradata set to 0x29c4ff0 (size: 22)
[rtsp @ 0x29c2e20] audio codec set to: aac
[rtsp @ 0x29c2e20] audio samplerate set to: 16000
[rtsp @ 0x29c2e20] audio channels set to: 1
[rtp @ 0x29c50a0] No default whitelist set
[udp @ 0x29c5200] No default whitelist set
[udp @ 0x29c5200] end receive buffer size reported is 131072
[udp @ 0x29d9480] No default whitelist set
[udp @ 0x29d9480] end receive buffer size reported is 131072
[rtsp @ 0x29c2e20] method SETUP failed: 461 Unsupported transport
[rtsp @ 0x29c2e20] CSeq: 3
[rtsp @ 0x29c2e20] setting jitter buffer size to 0
Last message repeated 1 times
[rtsp @ 0x29c2e20] hello state=0
[rtsp @ 0x29c2e20] All info found
[rtsp @ 0x29c2e20] rfps: 24.250000 0.018062
[rtsp @ 0x29c2e20] rfps: 24.333333 0.012911
[rtsp @ 0x29c2e20] rfps: 24.416667 0.008627
[rtsp @ 0x29c2e20] rfps: 24.500000 0.005207
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 24.583333 0.002653
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 24.666667 0.000965
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 24.750000 0.000142
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 24.833333 0.000185
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 24.916667 0.001093
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 25.000000 0.002867
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 25.083333 0.005507
Last message repeated 1 times
[rtsp @ 0x29c2e20] rfps: 25.166667 0.009011
[rtsp @ 0x29c2e20] rfps: 25.250000 0.013382
[rtsp @ 0x29c2e20] rfps: 25.333333 0.018618
[rtsp @ 0x29c2e20] rfps: 50.000000 0.011469
Input #0, rtsp, from 'rtsp://172.16.11.247:554/live/ch00_0?token=hQttXvrjSPOcClQB':
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0, 28, 1/90000: Video: h264 (High), 1 reference frame, yuv420p(left), 1280x720, 1/180000, 24.75 tbr, 90k tbn, 180k tbc
Stream #0:1, 23, 1/16000: Audio: aac (LC), 16000 Hz, mono, fltp
Successfully opened the file.
Parsing a group of options: output file /home/eason/ffmpeg-test/live.m3u8.
Applying option codec (codec name) with argument copy.
Applying option f (force format) with argument hls.
Successfully parsed a group of options.
Opening an output file: /home/eason/ffmpeg-test/live.m3u8.
Successfully opened the file.
[file @ 0x2cae180] Setting default whitelist 'file,crypto'
[mpegts @ 0x29f7ce0] muxrate VBR, pcr every 9000 pkts, sdt every 2147483647, pat/pmt every 2147483647 pkts
Output #0, hls, to '/home/eason/ffmpeg-test/live.m3u8':
Metadata:
encoder : Lavf57.29.101
Stream #0:0, 0, 1/90000: Video: h264, 1 reference frame, yuv420p(left), 1280x720 (0x0), 1/90000, q=2-31, 24.75 tbr, 90k tbn, 90k tbc
Stream #0:1, 0, 1/90000: Audio: aac (LC), 16000 Hz, mono
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
cur_dts is invalid (this is harmless if it occurs once at the start per stream)
Last message repeated 103 times
[hls @ 0x2a0fc00] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[AVIOContext @ 0x2c998c0] Statistics: 0 seeks, 155 writeouts=N/A speed=1.01x
[file @ 0x2ba60e0] Setting default whitelist 'file,crypto'
[file @ 0x2ca9fc0] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:0
[AVIOContext @ 0x2caa080] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 103 writeouts=N/A speed= 1x
[file @ 0x2ba60e0] Setting default whitelist 'file,crypto'
[file @ 0x2c97c60] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:0
[AVIOContext @ 0x2c97d20] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 104 writeouts=N/A speed= 1x
[file @ 0x2ba60e0] Setting default whitelist 'file,crypto'
[file @ 0x2c99680] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:0
[AVIOContext @ 0x2c99820] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 28 writeoutse=N/A speed= 1x
[file @ 0x29c50c0] Setting default whitelist 'file,crypto'
[file @ 0x2ba60e0] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:0
[AVIOContext @ 0x29c2ce0] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 111 writeouts=N/A speed= 1x
[file @ 0x2c97d40] Setting default whitelist 'file,crypto'
[file @ 0x2a134e0] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:0
[AVIOContext @ 0x2a11000] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 105 writeouts=N/A speed= 1x
[file @ 0x29c50c0] Setting default whitelist 'file,crypto'
[file @ 0x2a10c00] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:1
[AVIOContext @ 0x2a10cc0] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 103 writeouts=N/A speed= 1x
[file @ 0x29c50c0] Setting default whitelist 'file,crypto'
[file @ 0x2c99480] Setting default whitelist 'file,crypto'
.......repeat........
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:71
[AVIOContext @ 0x2c97fa0] Statistics: 0 seeks, 1 writeouts
[rtsp @ 0x29c2e20] Too short data for FU-A H264 RTP packette=N/A speed= 1x
[AVIOContext @ 0x2ba60e0] Statistics: 0 seeks, 103 writeouts=N/A speed= 1x
[file @ 0x2c97b20] Setting default whitelist 'file,crypto'
[file @ 0x2c97c60] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:72
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2ba60e0] Statistics: 0 seeks, 156 writeouts=N/A speed= 1x
[file @ 0x2c99480] Setting default whitelist 'file,crypto'
[file @ 0x2cab600] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:73
[AVIOContext @ 0x2cab6c0] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2ba60e0] Statistics: 0 seeks, 104 writeouts=N/A speed= 1x
[file @ 0x2cadc00] Setting default whitelist 'file,crypto'
[file @ 0x2c99480] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:74
[AVIOContext @ 0x29c2ce0] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x2ba60e0] Statistics: 0 seeks, 103 writeouts=N/A speed= 1x
[file @ 0x2a13540] Setting default whitelist 'file,crypto'
[file @ 0x2cab680] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:75
[AVIOContext @ 0x2c99480] Statistics: 0 seeks, 1 writeouts
No more output streams to write to, finishing.:46.09 bitrate=N/A speed=0.993x
[AVIOContext @ 0x2ba60e0] Statistics: 0 seeks, 138 writeouts
[file @ 0x29c50c0] Setting default whitelist 'file,crypto'
[hls @ 0x2a0fc00] EXT-X-MEDIA-SEQUENCE:76
[AVIOContext @ 0x2ba60e0] Statistics: 0 seeks, 1 writeouts
frame= 8423 fps= 21 q=-1.0 Lsize=N/A time=00:06:46.09 bitrate=N/A speed=0.993x
video:37031kB audio:1586kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (rtsp://172.16.11.247:554/live/ch00_0?token=hQttXvrjSPOcClQB):
Input stream #0:0 (video): 8423 packets read (37919815 bytes);
Input stream #0:1 (audio): 6345 packets read (1624337 bytes);
Total: 14768 packets (39544152 bytes) demuxed
Output file #0 (/home/eason/ffmpeg-test/live.m3u8):
Output stream #0:0 (video): 8423 packets muxed (37919815 bytes);
Output stream #0:1 (audio): 6345 packets muxed (1624337 bytes);
Total: 14768 packets (39544152 bytes) muxed
0 frames successfully decoded, 0 decoding errorsThe problem is that ffmpeg exits randomly after 5 to 20 minutes. The RTSP is a live stream so stopping every 5 minute is really not acceptable. In the ffmpeg log I can’t see any noticeable error except "No more output streams to write to, finishing." near the end. Can someone shed some light upon this ? How can I make ffmpeg run without stopping ? Thanks
-
FFmpeg how to apply "aac_adtstoasc" and "h264_mp4toannexb" bitstream filters to transcode to h.264 with AAC
9 juillet 2015, par larodI’ve been struggling with this issue for about a month, I have studied FFmpeg documentation more specifically transcode_aac.c, transcoding.c, decoding_encoding.c and Handbrake’s implementation which is really dense.
The error that I’m getting is the following :
[mp4 @ 0x11102f800] Malformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)
.The research I’ve done points to a filter that needs to be implemented.
FIX:AAC in some container format (FLV, MP4, MKV etc.) need "aac_adtstoasc" bitstream filter (BSF).
I know I can do the following :
AVBitStreamFilterContext* aacbsfc = av_bitstream_filter_init("aac_adtstoasc");
And then do something like this :
av_bitstream_filter_filter(aacbsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
What eludes me is when to filter the
AVPacket
, is it before callingav_packet_rescale_ts
or insideinit_filter
. I would greatly appreciate if someone can point me in the right direction. Thanks in advance.// Variables
AVFormatContext *_ifmt_ctx, *_ofmt_ctx;
FilteringContext *_filter_ctx;
AVBitStreamFilterContext *_h264bsfc;
AVBitStreamFilterContext *_aacbsfc;
NSURL *_srcURL, *_dstURL;
- (IBAction)trancode:(id)sender {
NSLog(@"%s %@",__func__, _mediaFile.fsName);
int ret, got_frame;
int (*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *);
unsigned int stream_index, i;
enum AVMediaType type;
AVPacket packet = {.data = NULL, .size = 0};
AVFrame *frame = NULL;
_h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
_aacbsfc = av_bitstream_filter_init("aac_adtstoasc");
_srcURL = [Utility urlFromBookmark:_mediaFile.bookmark];
if ([_srcURL startAccessingSecurityScopedResource]) {
NSString *newFileName = [[_srcURL.lastPathComponent stringByDeletingPathExtension]stringByAppendingPathExtension:@"mp4"];
_dstURL = [NSURL fileURLWithPath:[[_srcURL URLByDeletingLastPathComponent]URLByAppendingPathComponent:newFileName].path isDirectory:NO];
[AppDelegate ffmpegRegisterAll];
ret = open_input_file(_srcURL.path.fileSystemRepresentation);
if (ret < 0) {
NSLog(@"Error openning input file.");
}
ret = open_output_file(_dstURL.path.fileSystemRepresentation);
if (ret < 0) {
NSLog(@"Error openning output file.");
}
ret = init_filters();
if (ret < 0) {
NSLog(@"Error initializing filters.");
}
AVBitStreamFilterContext *h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
AVBitStreamFilterContext* aacbsfc = av_bitstream_filter_init("aac_adtstoasc");
// Transcode *******************************************************************************
while (1) {
if ((ret = av_read_frame(_ifmt_ctx, &packet)) < 0) {
break;
}
stream_index = packet.stream_index;
type = _ifmt_ctx->streams[packet.stream_index]->codec->codec_type;
av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n", stream_index);
if (_filter_ctx[stream_index].filter_graph) {
av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n");
frame = av_frame_alloc();
if (!frame) {
ret = AVERROR(ENOMEM);
break;
}
av_packet_rescale_ts(&packet, _ifmt_ctx->streams[stream_index]->time_base, _ifmt_ctx->streams[stream_index]->codec->time_base);
dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 : avcodec_decode_audio4;
ret = dec_func(_ifmt_ctx->streams[stream_index]->codec, frame, &got_frame, &packet);
if (ret < 0) {
av_frame_free(&frame);
av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
break;
}
if (got_frame) {
frame->pts = av_frame_get_best_effort_timestamp(frame);
ret = filter_encode_write_frame(frame, stream_index);
av_frame_free(&frame);
if (ret < 0)
goto end;
} else {
av_frame_free(&frame);
}
} else {
/* remux this frame without reencoding */
av_packet_rescale_ts(&packet,
_ifmt_ctx->streams[stream_index]->time_base,
_ofmt_ctx->streams[stream_index]->time_base);
ret = av_interleaved_write_frame(_ofmt_ctx, &packet);
if (ret < 0)
goto end;
}
av_free_packet(&packet);
}
// *****************************************************************************************
/* flush filters and encoders */
for (i = 0; i < _ifmt_ctx->nb_streams; i++) {
/* flush filter */
if (!_filter_ctx[i].filter_graph)
continue;
ret = filter_encode_write_frame(NULL, i);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");
goto end;
}
/* flush encoder */
ret = flush_encoder(i);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Flushing encoder failed\n");
goto end;
}
}
av_write_trailer(_ofmt_ctx);
av_bitstream_filter_close(h264bsfc);
av_bitstream_filter_close(aacbsfc);
} else {
NSLog(@"Unable to resolve url for %@",_mediaFile.url.lastPathComponent);
}
[_srcURL stopAccessingSecurityScopedResource];
end:
av_free_packet(&packet);
av_frame_free(&frame);
for (i = 0; i < _ifmt_ctx->nb_streams; i++) {
avcodec_close(_ifmt_ctx->streams[i]->codec);
if (_ofmt_ctx && _ofmt_ctx->nb_streams > i && _ofmt_ctx->streams[i] && _ofmt_ctx->streams[i]->codec)
avcodec_close(_ofmt_ctx->streams[i]->codec);
if (_filter_ctx && _filter_ctx[i].filter_graph)
avfilter_graph_free(&_filter_ctx[i].filter_graph);
}
av_free(_filter_ctx);
avformat_close_input(&_ifmt_ctx);
if (_ofmt_ctx && !(_ofmt_ctx->oformat->flags & AVFMT_NOFILE))
avio_closep(&_ofmt_ctx->pb);
avformat_free_context(_ofmt_ctx);
}The following method is used to open the input file and create the ifmt_ctx.
int open_input_file(const char *filename) {
int ret;
unsigned int i;
_ifmt_ctx = NULL;
if ((ret = avformat_open_input(&_ifmt_ctx, filename, NULL, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
return ret;
}
if ((ret = avformat_find_stream_info(_ifmt_ctx, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
return ret;
}
for (i = 0; i < _ifmt_ctx->nb_streams; i++) {
AVStream *stream;
AVCodecContext *codec_ctx;
stream = _ifmt_ctx->streams[i];
codec_ctx = stream->codec;
/* Reencode video & audio and remux subtitles etc. */
if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
|| codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
/* Open decoder */
ret = avcodec_open2(codec_ctx,
avcodec_find_decoder(codec_ctx->codec_id), NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i);
return ret;
}
}
}
// Remove later
av_dump_format(_ifmt_ctx, 0, filename, 0);
return 0;
}This method is used to open the output file and create the output format context.
int open_output_file(const char *filename) {
AVStream *out_stream;
AVStream *in_stream;
AVCodecContext *dec_ctx, *enc_ctx;
AVCodec *encoder;
int ret;
unsigned int i;
_ofmt_ctx = NULL;
avformat_alloc_output_context2(&_ofmt_ctx, NULL, NULL, filename);
if (!_ofmt_ctx) {
av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
return AVERROR_UNKNOWN;
}
for (i = 0; i < _ifmt_ctx->nb_streams; i++) {
out_stream = avformat_new_stream(_ofmt_ctx, NULL);
if (!out_stream) {
av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
return AVERROR_UNKNOWN;
}
in_stream = _ifmt_ctx->streams[i];
dec_ctx = in_stream->codec;
enc_ctx = out_stream->codec;
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
// set video stream
encoder = avcodec_find_encoder(AV_CODEC_ID_H264);
avcodec_get_context_defaults3(enc_ctx, encoder);
av_opt_set(enc_ctx->priv_data, "preset", "slow", 0);
enc_ctx->height = dec_ctx->height;
enc_ctx->width = dec_ctx->width;
enc_ctx->bit_rate = dec_ctx->bit_rate;
enc_ctx->time_base = out_stream->time_base = dec_ctx->time_base;
enc_ctx->pix_fmt = encoder->pix_fmts[0];
ret = avcodec_open2(enc_ctx, encoder, NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
return ret;
}
} else if (dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
// set audio stream
//encoder = avcodec_find_encoder(AV_CODEC_ID_AAC);
encoder = avcodec_find_encoder_by_name("libfdk_aac");
avcodec_get_context_defaults3(enc_ctx, encoder);
enc_ctx->profile = FF_PROFILE_AAC_HE_V2;
enc_ctx->sample_rate = dec_ctx->sample_rate;
enc_ctx->channel_layout = dec_ctx->channel_layout;
enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
enc_ctx->sample_fmt = encoder->sample_fmts[0];
enc_ctx->time_base = out_stream->time_base = (AVRational){1, enc_ctx->sample_rate};
enc_ctx->bit_rate = dec_ctx->bit_rate;
ret = avcodec_open2(enc_ctx, encoder, NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
return ret;
}
} else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
// deal with error
av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
return AVERROR_INVALIDDATA;
} else {
// remux stream
ret = avcodec_copy_context(_ofmt_ctx->streams[i]->codec,
_ifmt_ctx->streams[i]->codec);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n");
return ret;
}
}
if (_ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) {
enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
}
av_dump_format(_ofmt_ctx, 0, filename, 1);
NSURL *openFileURL = [Utility openPanelAt:[NSURL URLWithString:_dstURL.URLByDeletingLastPathComponent.path]
withTitle:@"Transcode File"
message:@"Please allow Maví to create the new file."
andPrompt:@"Grant Access"];
openFileURL = [openFileURL URLByAppendingPathComponent:_dstURL.lastPathComponent isDirectory:NO];
if (!(_ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
ret = avio_open(&_ofmt_ctx->pb, openFileURL.fileSystemRepresentation, AVIO_FLAG_WRITE);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
return ret;
}
}
/* init muxer, write output file header */
ret = avformat_write_header(_ofmt_ctx, NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
return ret;
}
return 0;
}These two methods deal with initialising the filters and filtering.
int init_filters(void) {
const char *filter_spec;
unsigned int i;
int ret;
_filter_ctx = av_malloc_array(_ifmt_ctx->nb_streams, sizeof(*_filter_ctx));
if (!_filter_ctx)
return AVERROR(ENOMEM);
for (i = 0; i < _ifmt_ctx->nb_streams; i++) {
_filter_ctx[i].buffersrc_ctx = NULL;
_filter_ctx[i].buffersink_ctx = NULL;
_filter_ctx[i].filter_graph = NULL;
if (!(_ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO
|| _ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
continue;
if (_ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
filter_spec = "null"; /* passthrough (dummy) filter for video */
else
filter_spec = "anull"; /* passthrough (dummy) filter for audio */
ret = init_filter(&_filter_ctx[i], _ifmt_ctx->streams[i]->codec,
_ofmt_ctx->streams[i]->codec, filter_spec);
if (ret)
return ret;
}
return 0;
}
int init_filter(FilteringContext* fctx, AVCodecContext *dec_ctx, AVCodecContext *enc_ctx, const char *filter_spec) {
char args[512];
int ret = 0;
AVFilter *buffersrc = NULL;
AVFilter *buffersink = NULL;
AVFilterContext *buffersrc_ctx = NULL;
AVFilterContext *buffersink_ctx = NULL;
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc();
AVFilterGraph *filter_graph = avfilter_graph_alloc();
if (!outputs || !inputs || !filter_graph) {
ret = AVERROR(ENOMEM);
goto end;
}
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
buffersrc = avfilter_get_by_name("buffer");
buffersink = avfilter_get_by_name("buffersink");
if (!buffersrc || !buffersink) {
av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
ret = AVERROR_UNKNOWN;
goto end;
}
snprintf(args, sizeof(args),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
dec_ctx->time_base.num, dec_ctx->time_base.den,
dec_ctx->sample_aspect_ratio.num,
dec_ctx->sample_aspect_ratio.den);
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
args, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
goto end;
}
ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
NULL, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
(uint8_t*)&enc_ctx->pix_fmt, sizeof(enc_ctx->pix_fmt),
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
goto end;
}
} else if (dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
buffersrc = avfilter_get_by_name("abuffer");
buffersink = avfilter_get_by_name("abuffersink");
if (!buffersrc || !buffersink) {
av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
ret = AVERROR_UNKNOWN;
goto end;
}
if (!dec_ctx->channel_layout)
dec_ctx->channel_layout =
av_get_default_channel_layout(dec_ctx->channels);
snprintf(args, sizeof(args),
"time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
dec_ctx->time_base.num, dec_ctx->time_base.den, dec_ctx->sample_rate,
av_get_sample_fmt_name(dec_ctx->sample_fmt),
dec_ctx->channel_layout);
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
args, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
goto end;
}
ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
NULL, NULL, filter_graph);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "sample_fmts",
(uint8_t*)&enc_ctx->sample_fmt, sizeof(enc_ctx->sample_fmt),
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "channel_layouts",
(uint8_t*)&enc_ctx->channel_layout,
sizeof(enc_ctx->channel_layout), AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
goto end;
}
ret = av_opt_set_bin(buffersink_ctx, "sample_rates",
(uint8_t*)&enc_ctx->sample_rate, sizeof(enc_ctx->sample_rate),
AV_OPT_SEARCH_CHILDREN);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
goto end;
}
} else {
ret = AVERROR_UNKNOWN;
goto end;
}
/* Endpoints for the filter graph. */
outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc_ctx;
outputs->pad_idx = 0;
outputs->next = NULL;
inputs->name = av_strdup("out");
inputs->filter_ctx = buffersink_ctx;
inputs->pad_idx = 0;
inputs->next = NULL;
if (!outputs->name || !inputs->name) {
ret = AVERROR(ENOMEM);
goto end;
}
if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_spec,
&inputs, &outputs, NULL)) < 0)
goto end;
if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
goto end;
/* Fill FilteringContext */
fctx->buffersrc_ctx = buffersrc_ctx;
fctx->buffersink_ctx = buffersink_ctx;
fctx->filter_graph = filter_graph;
end:
avfilter_inout_free(&inputs);
avfilter_inout_free(&outputs);
return ret;
}Finally these two methods take care of writing the frames.
int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame) {
int ret;
int got_frame_local;
AVPacket enc_pkt;
int (*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) =
(_ifmt_ctx->streams[stream_index]->codec->codec_type ==
AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;
if (!got_frame)
got_frame = &got_frame_local;
av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
/* encode filtered frame */
enc_pkt.data = NULL;
enc_pkt.size = 0;
av_init_packet(&enc_pkt);
ret = enc_func(_ofmt_ctx->streams[stream_index]->codec, &enc_pkt,
filt_frame, got_frame);
av_frame_free(&filt_frame);
if (ret < 0)
return ret;
if (!(*got_frame))
return 0;
/* prepare packet for muxing */
enc_pkt.stream_index = stream_index;
av_packet_rescale_ts(&enc_pkt,
_ofmt_ctx->streams[stream_index]->codec->time_base,
_ofmt_ctx->streams[stream_index]->time_base);
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
/* mux encoded frame */
ret = av_interleaved_write_frame(_ofmt_ctx, &enc_pkt);
return ret;
}
int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
{
int ret;
AVFrame *filt_frame;
av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
/* push the decoded frame into the filtergraph */
ret = av_buffersrc_add_frame_flags(_filter_ctx[stream_index].buffersrc_ctx,
frame, 0);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
return ret;
}
/* pull filtered frames from the filtergraph */
while (1) {
filt_frame = av_frame_alloc();
if (!filt_frame) {
ret = AVERROR(ENOMEM);
break;
}
av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
ret = av_buffersink_get_frame(_filter_ctx[stream_index].buffersink_ctx,
filt_frame);
if (ret < 0) {
/* if no more frames for output - returns AVERROR(EAGAIN)
* if flushed and no more frames for output - returns AVERROR_EOF
* rewrite retcode to 0 to show it as normal procedure completion
*/
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
ret = 0;
av_frame_free(&filt_frame);
break;
}
filt_frame->pict_type = AV_PICTURE_TYPE_NONE;
ret = encode_write_frame(filt_frame, stream_index, NULL);
if (ret < 0)
break;
}
return ret;
} -
ClassX installation "codec not found" due to dependencies [migrated]
25 mars 2014, par khateebClassX is an interactive lecture streaming system developed in the Electrical Engineering Department at Stanford University.
Unlike conventional lecture capturing systems, ClassX requires very simple consumer-grade equipment and minimal human operation.I faced problems during installing it, I hope you have a solution.
BTW : I successfully installed it 2 years ago, but now I think the problem as the dependencies and Ubuntu versions are different than the versions we used two years ago.
Detailed description of the problem :
- I'm using Ubuntu 12.04
- I followed the instructions @ ClassX installation guide, and all steps till step 4 are successfully done (the encoder bin file generated).
- When trying to encode the video using the classX web system, it shows the encoding completed after few seconds.However, there are no tiles generated.
-
I tried to execute the command at CX_log.txt, and the following error appears.
mahmoud@Mahmoud-HP-Pavilion-dv5-Notebook-PC : $ sudo perl /var/www/ClassXWebSystem/system/publishers/web/actions/encode.pl "/var/www/ClassXWebSystem/content/encoding/FALL_2013_2014/CS106A_FALL_2013_2014/lecSEven" "/var/www/ClassXWebSystem/content/encoding/FALL_2013_2014/CS106A_FALL_2013_2014/.encoding_1372706251" "/var/www/ClassXWebSystem/content/streaming/FALL_2013_2014/CS106A_FALL_2013_2014/lecSEven" "/var/www/ClassXWebSystem/system/publishers/bin" classx y n n
[sudo] password for mahmoud :
00068.jpg
..
.
00068.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/var/www/ClassXWebSystem/content/encoding/FALL_2013_2014/CS106A_FALL_2013_2014/.encoding_1372706251/00068.mp4' :
Metadata :
major_brand : isom
minor_version : 512
compatible_brands : isomiso2avc1mp41
encoder : Lavf52.39.0
Duration : 00:02:30.05, start : 0.000000, bitrate : 8141 kb/s
Stream #0.0(und) : Video : h264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 8007 kb/s, 29.95 fps, 29.97 tbr, 2997 tbn, 59.94 tbc
Stream #0.1(und) : Audio : aac, 44100 Hz, stereo, s16, 128 kb/s
Output #0, mp4, to '/var/www/ClassXWebSystem/content/encoding/FALL_2013_2014/CS106A_FALL_2013_2014/.encoding_1372706251/stream0.mp4' :
Stream #0.0 : Video : [0][0][0][0] / 0x0000, yuv420p, 640x360, q=32-36, 64 kb/s, 90k tbn, 14.99 tbc
codec not found