2012-04-07 5 views
3

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 

Antwort

1

Ich glaube, ich bezweifle, dass MEPG2 TS PCM Audio ermöglicht. Es kann MPI, MP2 oder AAC aufnehmen. AAC wird mehr als eine Standardauswahl und nicht als Identifizierung verwendet.

Im Gegensatz zu Video sind Audio-Header nicht sehr beschreibend. hat keine Startcodes und Zeug, also gibt es außer dem PES-Header normalerweise keine Möglichkeit, herauszufinden, um welche Art von Audio es sich handelt.

Audiodaten codieren, wenn möglich.

Versuchen Sie Gspot-Anwendung, um zu überprüfen.

+0

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

+0

Soll ich die frame_size einstellen? Warum ist es Null? – user1058600

+0

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

0

vor einiger Zeit habe ich auch damit gespielt. Und was ich herausgefunden habe ist: - Blu-ray unterstützt nur 48000 Sample Rate - Ich benutze immer BIG ENDIAN nicht wenig ENDIAN.

Ich denke, ffmpeg wird Blu-ray-Einstellungen für mpeg2_ts verwenden.

1

Sieht aus wie MPEG-TS unterstützt AES3-formatierte PCM-Audio als private Daten, wie von SMPTE 302M angegeben.

Es gibt derzeit einen s302m Encoder/Decoder in ffmpeg, mit dem Sie Ihr Ziel einfach erreichen können.

Verwandte Themen