4

ffmpeg を使用して、ビデオ (H.264) とオーディオ (PCM_S16LE、圧縮なし) を MPEG トランスポート ストリームに多重化しようとしています。ビデオは問題なく表示されます。ただし、オーディオ ストリームは再生されません。ffprobe によって表示されるオーディオ ストリームは AAC ですが、これは明らかに私の意図ではありません。したがって、オーディオストリームを追加する際に何か間違ったことをしているに違いありません。これを修正する方法はありますか?

これは、オーディオ ストリームを追加するための私のコードです。

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);
    }
}

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
4

3 に答える 3

1

MEPG2 TS で PCM オーディオが許可されるとは思えません。MPI、MP2、または AAC を使用できます。AAC は、ID というよりもデフォルトの選択肢として取り上げられています。

また、ビデオとは異なり、オーディオ ヘッダーはそれほど明確ではありません。つまり、スタート コードなどがないため、通常、PES ヘッダー以外に、それがどのタイプのオーディオであるかを調べる方法はありません。

可能であればオーディオをエンコードします。

Gspot アプリを使ってクロスチェックしてみてください。

于 2012-04-09T09:17:13.403 に答える