Ich versuche, Video (H.264) und Audio (PCM_S16LE, keine Komprimierung) in einen MPEG-Transportstrom mit ffmpeg mux. Das Video zeigt gut. Der Audiostream wird jedoch nicht wiedergegeben. Der Audiostream von ffprobe ist AAC, was natürlich nicht meine Absicht ist. Also muss ich etwas falsch machen, wenn ich den Audio-Stream hinzufüge. Irgendeine Idee, wie ich das korrigieren kann?Mux in MPEG-TS: falsche Parameter für Audio-Stream
Dies ist mein Code für das Hinzufügen eines Audio-Stream:
void add_audio_stream()
{
CodecID codec_id = CODEC_ID_PCM_S16LE;
AVStream *p_ast = av_new_stream(fc, 1);
if (!p_ast) {
fprintf(stderr, "Could not alloc audio stream\n");
exit(1);
}
ai = p_ast->index;
AVCodecContext *pcc = p_ast->codec;
avcodec_get_context_defaults2(pcc, AVMEDIA_TYPE_AUDIO);
pcc->codec_type = AVMEDIA_TYPE_AUDIO;
pcc->codec_id = codec_id;
pcc->sample_fmt = AV_SAMPLE_FMT_S16;
//pcc->bit_rate = 44100*16*2;
pcc->bit_rate = 0;
pcc->sample_rate = 44100;
pcc->channels = 2;
pcc->time_base = (AVRational){1, 44100};
// some formats want stream headers to be separate
if (fc->oformat->flags & AVFMT_GLOBALHEADER)
{
printf(" **** 1 ****\n");
pcc->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
else
printf(" **** 2 ****\n");
AVCodec *codec;
/* find the audio encoder */
codec = avcodec_find_encoder(pcc->codec_id);
if (!codec) {
fprintf(stderr, "codec not found\n");
exit(1);
}
/* open it */
if (avcodec_open(pcc, codec) < 0)
{
fprintf(stderr, "could not open codec\n");
exit(1);
}
}
Hier ist die Ausgabe von ffprobe:
ffprobe version N-32405-g6337de9, Copyright (c) 2007-2011 the FFmpeg developers
built on Sep 8 2011 11:20:12 with gcc 4.4.3
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame
libavutil 51. 16. 0/51. 16. 0
libavcodec 53. 13. 0/53. 13. 0
libavformat 53. 12. 0/53. 12. 0
libavdevice 53. 3. 0/53. 3. 0
libavfilter 2. 39. 0/2. 39. 0
libswscale 2. 1. 0/2. 1. 0
libpostproc 51. 2. 0/51. 2. 0
[mpegts @ 0xa96daa0] Continuity Check Failed
[mpegts @ 0xa96daa0] Continuity Check Failed
[aac @ 0xa974da0] channel element 0.1 is not allocated
[aac @ 0xa974da0] More than one AAC RDB per ADTS frame is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
.
.
lot of gobbly-gook about missing AAC parameters . . .
.
.
[aac @ 0xa974da0] More than one AAC RDB per ADTS frame is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
[aac @ 0xa974da0] Error decoding AAC frame header.
[mpegts @ 0xa96daa0] max_analyze_duration 5000000 reached at 5429789
[mpegts @ 0xa96daa0] Continuity Check Failed
[mpegts @ 0xa96daa0] Continuity Check Failed
Input #0, mpegts, from 'test_audio_video.mts':
Duration: 00:00:40.35, start: 0.010000, bitrate: 1907 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0.0[0x100]: Video: h264 (Constrained Baseline) ([27][0][0][0]/0x001B), yuv420p, 640x480, 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0.1[0x101]: Audio: aac ([6][0][0][0]/0x0006), 96000 Hz, 4.0, s16, 9 kb/s
Vielen Dank für Ihren Einblick, Dipan! Viele Referenzen, die ich gefunden habe, scheinen jedoch darauf hinzuweisen, dass lineares unkomprimiertes PCM in MPEG-2 TS unterstützt wird. Anscheinend verwenden viele Fernsehsender rohe PCM (ich weiß, dass Bandbreite in diesem Prozess verschwendet wird, aber trotzdem). Zum Beispiel (http://en.wikipedia.org/wiki/.m2ts) schlägt vor, dass im Blu-ray-Szenario rohe PCM verwendet wird. Weitere Beispiele: http://forum.doom9.org/archive/index.php/t-153453.html http://forums.adobe.com/thread/384204 Ich glaube, ich vermisse ein kleines Detail . Ich werde heute kämpfen. Fühlen Sie sich frei, etwas zu empfehlen, wenn Sie einen Fehler entdecken. THX – user1058600
Soll ich die frame_size einstellen? Warum ist es Null? – user1058600
Entschuldigung, für obigen Kommentar meinte ich: pcc-> frame_size ist 1 nachdem ich den Codec mit avcodec_open2 (pcc, codec, NULL) geöffnet habe. Warum ist frame_size gleich 1 Beispiel? Das macht kein sinn. – user1058600