tag:blogger.com,1999:blog-1801476278712273225.post3151748127908181067..comments2023-08-21T05:30:45.605-03:00Comments on The Samurai Code: Grabando Audio desde el microfono con FFmpeg + QtMultimediahipersayan_xhttp://www.blogger.com/profile/04819141995596683913noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-1801476278712273225.post-52316777162482782212015-12-17T19:37:36.067-03:002015-12-17T19:37:36.067-03:00Sí, lo sé, por lo general con todas las configurac...Sí, lo sé, por lo general con todas las configuraciones especiales que tiene cada codec es muy difícil hacer un ejemplo trivial, por que a veces hay que meterle algún parche para que funcione con tal o cual codec. Además de que los devs modifican bastante seguido la API. Por lo general, el mejor ejemplo de como usar la API de FFmpeg es el mismo <a href="https://github.com/FFmpeg/FFmpeg/blob/master/ffmpeg.c#L843" rel="nofollow">FFmpeg</a>.<br />hipersayan_xhttps://www.blogger.com/profile/04819141995596683913noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-72223784009483228282015-12-17T15:31:41.953-03:002015-12-17T15:31:41.953-03:00El wav lo grabo con QAudioRecorder, con todas las ...El wav lo grabo con QAudioRecorder, con todas las opciones x defecto, pero estaria buenisimo que los frames que obtenga los pudiera usar con el avcodec_encode_audio2(), solo que no encuentro ningun ejemplo completo en la web de como hacerlo.Robertohttps://www.blogger.com/profile/16700069479309906708noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-57648581530331928162015-12-17T15:19:40.027-03:002015-12-17T15:19:40.027-03:00Es lógico, en FFmpeg el formato WAV almacena por d...Es lógico, en FFmpeg el formato WAV almacena por defecto las muestras en formato pcm_s16le, o dicho de otro modo, el audio en bruto. Aunque también puedes optar por <a href="https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/riff.c#L383" rel="nofollow">otros codecs</a> usando<br /><br />fmt->audio_codec = avcodec_find_encoder_by_name("codec");<br />hipersayan_xhttps://www.blogger.com/profile/04819141995596683913noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-91221982673096991212015-12-17T14:25:12.180-03:002015-12-17T14:25:12.180-03:00Gracias x la ayuda, pero bueno, revisando el wav m...Gracias x la ayuda, pero bueno, revisando el wav mas optimizado pesa 230~300 mb , y si despues de generar el wav lo convierto con el ffmpeg con qprocess el proceso tarda 1 minuto solamente, asi que lo puedo dar por aceptable. Lo unico es que tendria que implementar algo para parsear la salida del ffmpeg y ponerlo en un Progressbar o algo parecido.<br />GraciasRobertohttps://www.blogger.com/profile/16700069479309906708noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-57613029825148878992015-12-17T12:52:24.899-03:002015-12-17T12:52:24.899-03:00En principio Qt tiene la clase QMediaRecorder pero...En principio Qt tiene la clase <a href="http://doc.qt.io/qt-5/qmediarecorder.html" rel="nofollow">QMediaRecorder</a> pero la interfaz que ofrece es muy pobre, y paso de usar QtMultimedia en general (malas experiencias). QtMEL no lo he probado así que no puedo dar una opinión, y QtAV, hasta donde yo sé es únicamente para reproducción. Y de plano podemos descartar DShow y MediaFoundation por no ser multiplataforma, y por que además MMF no está del todo implementada en MinGW.<br /><br />Con lo que en mí opinión las únicas opciones que quedan son FFmpeg y GStreamer, con FFmpeg he trabajado bastante aunque todavía no he probado en grabar en Windows, pero imagino que debe tener el mismo rendimiento que en GNU/Linux. Con GStreamer, sé que se puede compilar con MinGW, hace poco empece a hacer <a href="https://github.com/hipersayanX/webcamoid/tree/master/Qb/Plugins/MultiSink/src/gstreamer" rel="nofollow">algunas pruebas</a>, pero va a pasar un tiempo hasta que tenga algo funcional.<br /><br />Ahora bien, volviendo al tema original, para encodear en formato MP3 necesitas el codec <b>libmp3lame</b>, este codec tiene algunas restricciones que el audio que quieras grabar debe cumplir, por ejemplo, la frecuencia de muestreo del audio de entrada debe debe ser alguna de las siguientes:<br /><br />48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000<br /><br />y los formatos de las muestra de entrada pueden ser fltp (flotante de 32 bits planar), s32p (entero con signo de 32 bits planar) o s16p (entero con signo de 16 bits planar). Toda esa información la puedes obtener de la estructura AVCodec:<br /><br />audio_st->codec->codec->supported_samplerates<br />audio_st->codec->codec->sample_fmts<br />audio_st->codec->codec->channel_layouts<br /><br />También tienes la limitación del tamaño del buffer de audio que puedes escribir, lo puedes consultar desde audio_st->codec->frame_size.<br /><br />Una vez que obtienes esa información, conviertes el audio de entrada usando <a href="https://www.ffmpeg.org/doxygen/2.8/group__lswr.html" rel="nofollow">SWResample</a> y se lo pasas a avcodec_encode_audio2.<br /><br />Otro detalle, es que si en el buffer quedan 600mb es muy probablemente que los valores de PTS están mal colocados.<br /><br />Y para finalizar, ahora que lo veo voy a tener actualizar el código, por que este usa la API vieja, voy a ver si lo puedo subir en unas horas o a mas tardar esta semana.<br />hipersayan_xhttps://www.blogger.com/profile/04819141995596683913noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-50125178128882632062015-12-17T10:36:36.173-03:002015-12-17T10:36:36.173-03:00Hola, soy un hereje ya que programo Qt en windows ...Hola, soy un hereje ya que programo Qt en windows (je je) y tengo el problema de los codecs. Ya que averiguando encontre que QtMultimedia usa DShow y este sistema solo tiene PCM, o sea wav. Por lo que no encuentro la forma de grabar directamente en MP3 como lo hago en linux. Probe con QtMel y Qtav pero no andan bien en windows y con ffmpeg tampoco, ya que si grabo el wav de 1 hora me quedan 600mb en buffer que tardaria muchisimo en convertir. Sabes alguna solucion? Gracias<br />Robertohttps://www.blogger.com/profile/16700069479309906708noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-36779482635194052922013-12-17T12:24:23.618-03:002013-12-17T12:24:23.618-03:00Gracias hipersayan_x, estoy comenzando con Qt crea...Gracias hipersayan_x, estoy comenzando con Qt creator y esto me parece muy interesanteMikehttps://www.blogger.com/profile/09790926615686397645noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-76950839761177284062012-08-07T18:14:48.397-03:002012-08-07T18:14:48.397-03:00¿Sos el mismo de esta pregunta? Una vez que obtené...¿Sos el mismo de <a href="http://www.zonaqt.com/foro/%C2%BFcomo-puedo-obtener-frames-de-audio-de-tama%C3%B1o-fijo#comment-3708" rel="nofollow">esta pregunta</a>? Una vez que obtenés el frame de audio con <b>input_stream->read(bytes_ready)</b>, ese mismo frame lo mandás al encoder, pej. a <a href="http://hipersayanx.blogspot.com/2011/07/ffmpeg-qtmultimedia-pipes.html" rel="nofollow">FFmpeg</a>, o también podes enviar ese frame a <a href="http://sourceforge.net/projects/flac/files/flac-src/flac-1.2.1-src/" rel="nofollow">flac</a>.hipersayan_xhttps://www.blogger.com/profile/04819141995596683913noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-51568535398006563122012-08-03T19:10:18.701-03:002012-08-03T19:10:18.701-03:00Hola Hipersayanx,
muy buen tuto!
Tengo una duda q...Hola Hipersayanx,<br /><br />muy buen tuto!<br />Tengo una duda que quizas puedas ayudarme, necesito hacer una especie de audio level, medir el volumen de la voz o algo similar.<br /><br />El tema es el siguiente como hago yo para encodear el frame de la funcion "void AudioCapture::getAudioFrame()" en flac (es el formato que necesito), es decir necesito que al hablar y hacer un silencio se guarde en un archivo en formato flac.<br /><br />Se puede hacer esto utilizando QAudioInput?? seria ideal porque es un proyecto que tengo para portalo a Meego (nokia n9) usando qt. Si tenes alguna idea de como hacerlo o si conoces algun sitio con info me vendria genial! Estoy empezando con esto del audio y demas, me seria de buena ayuda tu respuesta, un abrazo!Unknownhttps://www.blogger.com/profile/15449600131440046781noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-89390694576505467382011-11-15T11:52:40.456-03:002011-11-15T11:52:40.456-03:00Si usas la API de FFmpeg bajate el snapshot de FFm...Si usas la API de FFmpeg bajate el <a href="http://git.videolan.org/?p=ffmpeg.git;a=snapshot;h=HEAD;sf=tgz" rel="nofollow">snapshot</a> de FFmpeg y mira el ejemplo que esta en <i>ffmpeg/doc/examples/decoding_encoding.c</i> en la función <i>audio_decode_example()</i>, con eso podes obtener los frames de audio, en ese caso obligatoriamente tenes que incluir la misma copia de FFmpeg con la que hiciste las pruebas, porque sino puede pasar que entre cada snapshot, la API cambia completamente y el código deje de funcionar como me paso a mí :(<br />Sino otra posibilidad es usando tuberías, decodificas el archivo de audio usando FFmpeg y enviás los frames de audio en formato raw a una tubería y luego desde tu programa lees los frames desde la tubería como si fuera un archivo normal. Revisá mi <a href="http://hipersayanx.blogspot.com/2011/07/ffmpeg-qtmultimedia-pipes.html" rel="nofollow">otro articulo</a> para que te des una idea.<br />Ya con eso no tendrías problemas con los cambios de versión de FFmpeg porque los parámetros seguirían siendo los mismos.hipersayan_xhttps://www.blogger.com/profile/04819141995596683913noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-34369252575071139802011-11-14T22:03:14.291-03:002011-11-14T22:03:14.291-03:00Yo creo que si; quiero obtener los samples de audi...Yo creo que si; quiero obtener los samples de audio de los bits compresados gracias a ogg.arellanonhttps://www.blogger.com/profile/16669765330710152365noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-84913638304585879952011-11-14T21:29:41.969-03:002011-11-14T21:29:41.969-03:00¿Te referís al caso inverso? o sea ¿obtener los fr...¿Te referís al caso inverso? o sea ¿obtener los frames de audio con FFmpeg? ¿o a <a href="http://www.xiph.org/ogg/doc/libogg/" rel="nofollow">libogg</a>?hipersayan_xhttps://www.blogger.com/profile/04819141995596683913noreply@blogger.comtag:blogger.com,1999:blog-1801476278712273225.post-42738868417287370082011-11-14T21:11:14.811-03:002011-11-14T21:11:14.811-03:00Gracias por la explicacion de este methodo. De pur...Gracias por la explicacion de este methodo. De pura casualidad no tienen el decoder para ogg? :)arellanonhttps://www.blogger.com/profile/16669765330710152365noreply@blogger.com