ffmpeg으로 디코딩해서 alsa로 출력하는 간단한 C/C++예제 코드 없을까요?

klara의 이미지

만들고 있는 동영상 플레이어의 백엔드로, ffmpeg을 써볼까해서, ffmpeg tutorial을 보면서 따라해보고있습니다.
그런데, tutorial에는 SDL을 이용하고 있는데에 반해, 전 Qt를 이용하고 있으니 무조건 따라하기가 불가능하네요.
일단 비디오는 싱크는 무시하고 프레임별로 뽑아와서 표시하는데까진 간단하게 할 수 있었습니다.
다음으로 오디오 출력을 해볼려고 하는데, tutorial에는 오디오 프레임을 디코딩에서 SDL로 넘겨버리기 때문에, Qt를 이용하는 저로썬 다른 방법을 찾아보아야 했습니다.
그러다가 ffmpeg으로 디코딩하는 akode라는 라이브러리를 찾았지만, 출력부분이 추상화되있고 각 드라이버가 플러그인으로 짜여있어서 예제로 참고하기엔 너무 복잡하더라구요.
어떻게 출력해야될지도 모르는데 첨부터 추상화시켜서 짜는건 힘들기때문에, 일단은 alsa로 출력하는걸 목표로 짜볼려고 하는데요, 최대한 간단하게, 오디오파일을 ffmpeg으로 디코딩하고 alsa로 출력하는 참고할만한 C/C++ 소스 코드가 없을까요?

madman93의 이미지


일단 구현된 예제를 보는것이 좋을 듯 합니다.
제 개인적인 의견입니다만
alsa보다는 oss쪽이 구현을 먼저 해 보는것이 간단하지 않을까요?

---------------------------------------------
리눅스가 싫다 우분투가 좋다
---------------------------------------------

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

klara의 이미지

답변감사합니다.
oss쪽이 좀더 쓰기 편한가요...?
alsa를 선택한이유가, alsa쪽이 oss보다 더 많이 쓰이는 듯한 인상이 있고, 당장 제 컴퓨터에서도 oss로 출력하도록 프로그램을 설정하면 문제가 발생하는 경우가 있곤 해서입니다.
FFmpeg홈페이지에 관련 프로젝트들이 소개되있는 것을 알았습니다.
한번 이것들을 뒤져봐야겠네요.

korone.net의 이미지

ffmpeg의 경우 다음과 같이 decoding을 할 수있습니다.
wav데이타가 나오면 이것을 사운드 장치에 출력으로 넣으시면 Qt에서도 쓸 수 있습니다.

AVCodecContext* ctx = avcodec_alloc_context();
ctx->codec_type = CODEC_TYPE_AUDIO;
ctx->codec_id = 적절한 코덱 ID;
ctx->channels = 채널;
ctx->sample_rate = 샘플레이트;

// 코덱오픈
AVCodec* codec = avcodec_find_decoder(ctx->codec_id);
avcodec_open(ctx, codec);

avcodec_decode_audio2() 함수로 decoding하면 decoding된 wav데이타가 나옵니다. 이것을 그대로 플레이 시키면 됩니다.

korone.net qt programming site

klara의 이미지

답변해주셔서 감사합니다.
사실 avcodec_decode_audio2()를 호출하는 곳까진 짜봤는데, 이걸로 뭘 어떻게 해야할지가 막막합니다-_-;
튜토리얼에서는 여기서 넘어온 데이터를 다시 SDL쪽으로 넘겨주니까 이걸 이용해서 어떻게 출력하면 될듯한데, 그 '어떻게'를 몰라서 막힌 상태입니다.

newmania의 이미지

먼저 작업해보시면 응용할 수 있는 선택의 폭이 넓어집니다. 제 생각으로는 FFMPEG 이 연동가능한 output 을 파악한 뒤에 원하는 방식으로 연결하는 것이 좋을 듯 합니다.

klara의 이미지

답변감사합니다. 말씀하신대로 일단은 wav파일 재생을 해봐야겠네요.
그런데 '연동가능'하다는게 무슨 뜻인지 잘 모르겠습니다. FFmpeg으로 디코딩까지만 해주고, 출력은 프로그래머가 해줘야되는것 아니었나요...?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.